home *** CD-ROM | disk | FTP | other *** search
/ Steal This CD / steal_this_cd.iso / Chapter 07 - Where the Hackers Are / virc200.exe / {app} / Scripts / virc.lib < prev    next >
Text File  |  2003-12-25  |  72KB  |  2,518 lines

  1. // Visual IRC 2.0 default script library
  2. // Main IRC client interface
  3.  
  4. @ $LibVersion = 2.0
  5. @ $LibBuild = 200
  6. @ $LibMessageVersion = 4
  7. @l $RequiredViRC = 200
  8. @l $RequiredPre = 14
  9. @l $RequiredVersion = 2.0rc4
  10.  
  11. if ([${FirstRun}] == []) && ([$2] == [firstrun])
  12.   @ $FirstRun = 1
  13. else
  14.   @ $FirstRun = 0
  15. endif
  16.  
  17. // Message translations supplied with ViRC:
  18. //   english.lib   (English messages)
  19.  
  20. @l $translation = english.lib
  21.  
  22. Load $translation
  23.  
  24. //--------------
  25.  
  26. // Client version check
  27. if ($build < $RequiredViRC) || (($build == $RequiredViRC) && ($prebuild != 0) && ($prebuild < $RequiredPre))
  28.   @l $msg = $eval($Msg_RequiredVersion)
  29.   if ($messagedlg(305 $msg) == 2)
  30.     Exit
  31.   endif
  32. endif
  33.  
  34. // Message version check
  35. if [$IgnoreMessageVersion] == [$$IgnoreMessageVersion]
  36.   @s $IgnoreMessageVersion = 0
  37. endif
  38. if [$MessageVersion] == [$$MessageVersion]
  39.   MessageBox Invalid message file: $translation
  40. else if ($MessageVersion < $LibMessageVersion) && ($IgnoreMessageVersion < $LibMessageVersion)
  41.   MessageBox $eval($Msg_OutdatedMessages)
  42.   @s $IgnoreMessageVersion = $LibMessageVersion
  43. endif
  44.  
  45. //--------------
  46.  
  47. // localization helpers
  48.  
  49. Alias _XW_LOCALIZE_MENUTREE
  50.   for (@l $i = 0; $i < $prop($__Block__.Count); $i++)
  51.     @l $line = $__Block__.GetString($i)
  52.     @l $before = $strtokl(@@ $line)
  53.     @l $after = $strtokr(@@ $line)
  54.     if [$after] != []
  55.       $__Block__.SetString $i $before${$after}
  56.     endif
  57.   endfor
  58.   $__Block__.SaveToMenuTree $1
  59. EndAlias
  60.  
  61. ExtendWith localized_menutree [xwEvalParams,xwNewContext] = _XW_LOCALIZE_MENUTREE
  62.  
  63. Alias _XW_LOCALIZE_TOOLBAR
  64.   for (@l $i = 0; $i < $prop($__Block__.Count); $i++)
  65.     @l $line = $__Block__.GetString($i)
  66.     @l $before = $strtokl(@@ $line)
  67.     @l $after = $strtokr(@@ $line)
  68.     if [$after] != []
  69.       $__Block__.SetString $i $before${$after}
  70.     endif
  71.   endfor
  72.   $__Block__.SaveToToolbar $1-
  73. EndAlias
  74.  
  75. ExtendWith localized_toolbar [xwEvalParams,xwNewContext] = _XW_LOCALIZE_TOOLBAR
  76.  
  77. //--------------
  78.  
  79. // first-time users: what add-ons should we use initially?
  80. if $FirstRun
  81.   @l $try_addons = smileys.vsc sounds.vsc
  82.  
  83.   // is Winamp running, by chance?
  84.   if $FindWindow("Winamp v1.x")
  85.     @l $try_addons = $listcat($try_addons winamp.vsc)
  86.   endif
  87.  
  88.   // make sure the scripts really exist
  89.   @l $addons = $null
  90.   foreach ($i; $try_addons)
  91.     if $fileexists($getpath(script)$i)
  92.       @l $addons = $listcat($addons $i)
  93.     endif
  94.   endforeach
  95.  
  96.   @ $RecommendedAddOns = $addons
  97. endif
  98.  
  99. //--------------
  100.  
  101. With > localized_menutree MT_MAINMENU
  102.   M_FILE          <none> 0 0 @@Msg_File_Caption
  103.   M_FILENEWSERVER Ctrl+S 0 1 "tbstart.bmp" @@Msg_File_NewServerCaption
  104.   M_CLIENTSETUP   <none> 0 1 "tbconfig.bmp" @@Msg_File_ClientSetupCaption
  105.   M_SCRIPTEDITOR  <none> 0 1 "tbscript.bmp" @@Msg_File_ScriptEditorCaption
  106.   M_NOTIFYSETUP   <none> 0 1 @@Msg_File_NotifySetupCaption
  107.   M_SERVERLIST    <none> 0 1 @@Msg_File_ServerListCaption
  108.   M_FILESEP1      <none> 0 1 -
  109.   M_DCCLIST       Ctrl+D 0 1 @@Msg_File_DCCListCaption
  110.   M_FILESEP2      <none> 0 1 -
  111.   M_GETSMART      <none> 0 1 "tbglobe.bmp" @@Msg_File_GetSmartCaption
  112.   M_FILEEXIT      Alt+X  0 1 "tbexit_sm.bmp" @@Msg_File_ExitCaption
  113.   M_VIEW          <none> 0 0 @@Msg_View_Caption
  114.   M_STATUSON      <none> !%isstatusvisible 1 @@Msg_View_StatusOnCaption
  115.   M_STATUSOFF     <none> %isstatusvisible  1 @@Msg_View_StatusOffCaption
  116. EndWith
  117.  
  118. MenuHint M_FILENEWSERVER on MT_MAINMENU = $Msg_File_NewServerHint
  119. MenuHint M_CLIENTSETUP on MT_MAINMENU = $Msg_File_ClientSetupHint
  120. MenuHint M_SCRIPTEDITOR on MT_MAINMENU = $Msg_File_ScriptEditorHint
  121. MenuHint M_NOTIFYSETUP on MT_MAINMENU = $Msg_File_NotifySetupHint
  122. MenuHint M_SERVERLIST on MT_MAINMENU = $Msg_File_ServerListHint
  123. MenuHint M_DCCLIST on MT_MAINMENU = $Msg_File_DCCListHint
  124. MenuHint M_GETSMART on MT_MAINMENU = $Msg_File_GetSmartHint
  125. MenuHint M_FILEEXIT on MT_MAINMENU = $Msg_File_ExitHint
  126. MenuHint M_STATUSON on MT_MAINMENU = $Msg_View_StatusOnHint
  127. MenuHint M_STATUSOFF on MT_MAINMENU = $Msg_View_StatusOffHint
  128.  
  129. MenuItem M_FILENEWSERVER on MT_MAINMENU
  130.   NewServerWindow
  131. EndMenuItem
  132.  
  133. MenuItem M_CLIENTSETUP on MT_MAINMENU
  134.   ShowClientSetup
  135. EndMenuItem
  136.  
  137. MenuItem M_SCRIPTEDITOR on MT_MAINMENU
  138.   ShowScriptEditor
  139. EndMenuItem
  140.  
  141. MenuItem M_NOTIFYSETUP on MT_MAINMENU
  142.   ShowNotifySetup
  143. EndMenuItem
  144.  
  145. MenuItem M_SERVERLIST on MT_MAINMENU
  146.   ShowServerList
  147. EndMenuItem
  148.  
  149. MenuItem M_DCCLIST on MT_MAINMENU
  150.   ShowDCCList
  151. EndMenuItem
  152.  
  153. MenuItem M_FILEEXIT on MT_MAINMENU
  154.   Exit
  155. EndMenuItem
  156.  
  157. MenuItem M_GETSMART on MT_MAINMENU
  158.   CheckForUpdates
  159. EndMenuItem
  160.  
  161. MenuItem M_STATUSON on MT_MAINMENU
  162.   EnableStatus
  163. EndMenuItem
  164.  
  165. MenuItem M_STATUSOFF on MT_MAINMENU
  166.   DisableStatus
  167. EndMenuItem
  168.  
  169. With > localized_menutree MT_TRAYPOPUP
  170.   M_EXIT <none> 0 0 "tbexit_sm.bmp" @@Msg_Tray_ExitCaption
  171. EndWith
  172.  
  173. MenuItem M_EXIT on MT_TRAYPOPUP
  174.   Exit
  175. EndMenuItem
  176.  
  177. // logging/timestamp popup is merged into all text output windows
  178.  
  179. With > localized_menutree MT_LOGGING
  180.   M_LOGGING    <none> 0                 0 @@Msg_Log_LoggingCaption
  181.   M_OPENLOG    <none> !%islogging       1 "tbopenlog.bmp" @@Msg_Log_OpenLogCaption
  182.   M_CLOSELOG   <none> %islogging        1 "tbcloselog.bmp" @@Msg_Log_CloseLogCaption
  183.   M_VIEWLOG    <none> 0                 1 "tblogging.bmp" @@Msg_Log_ViewLogCaption
  184.   M_TIMESTAMP  <none> 0                 0 @@Msg_Log_TimestampCaption
  185.   M_SHOWTS     <none> !%istimestamping  1 "tbtimestampon.bmp" @@Msg_Log_ShowTSCaption
  186.   M_HIDETS     <none> %istimestamping   1 "tbtimestampoff.bmp" @@Msg_Log_HideTSCaption
  187. EndWith
  188.  
  189. MenuHint M_OPENLOG on MT_LOGGING = $Msg_Log_OpenLogHint
  190. MenuHint M_CLOSELOG on MT_LOGGING = $Msg_Log_CloseLogHint
  191. MenuHint M_VIEWLOG on MT_LOGGING = $Msg_Log_ViewLogHint
  192. MenuHint M_SHOWTS on MT_LOGGING = $Msg_Log_ShowTSHint
  193. MenuHint M_HIDETS on MT_LOGGING = $Msg_Log_HideTSHint
  194.  
  195. Alias ISTIMESTAMPING
  196.   @l $obj = $mapobject($1:Output)
  197.   @ $fresult = $([$prop($obj.TimeStamps)] == [True])
  198.   UnmapObject $obj
  199. EndAlias
  200.  
  201. MenuItem M_OPENLOG on MT_LOGGING
  202.   Log open $C
  203. EndMenuItem
  204.  
  205. MenuItem M_CLOSELOG on MT_LOGGING
  206.   Log close $C
  207. EndMenuItem
  208.  
  209. MenuItem M_VIEWLOG on MT_LOGGING
  210.   if $ischannel($C)
  211.     @l $file = $eval($getsetting(Logging ChannelLog))
  212.   else if [$C] == [.]
  213.     @l $file = $eval($getsetting(Logging ServerLog))
  214.   else if $isquerying($C)
  215.     @l $file = $eval($getsetting(Logging QueryLog))
  216.   else if $isdccchatting($C)
  217.     @l $file = $eval($getsetting(Logging ChatLog))
  218.   else
  219.     Halt
  220.   endif
  221.   
  222.   // don't open programs or scripts
  223.   @l $ext = $rstrtokr(. $file)
  224.   Halt if $isinset([$ext] [exe,com,vsc])
  225.   
  226.   Exec "$getpath(log)$file"
  227. EndMenuItem
  228.  
  229. MenuItem M_SHOWTS on MT_LOGGING
  230.   @l $obj = $mapobject($C:Output)
  231.   @p $obj.TimeStamps = True
  232.   UnmapObject $obj
  233. EndMenuItem
  234.  
  235. MenuItem M_HIDETS on MT_LOGGING
  236.   @l $obj = $mapobject($C:Output)
  237.   @p $obj.TimeStamps = False
  238.   UnmapObject $obj
  239. EndMenuItem
  240.  
  241. With > localized_menutree MT_SERVERPOPUP
  242.   M_CONNECT    <none> 2 0 "tbconnect.bmp" @@Msg_Serv_ConnectCaption
  243.   M_DISCONNECT <none> 1 0 "tbdisconnect.bmp" @@Msg_Serv_DisconnectCaption
  244. EndWith
  245.  
  246. MenuHint M_CONNECT on MT_SERVERPOPUP = $Msg_Serv_ConnectHint
  247. MenuHint M_DISCONNECT on MT_SERVERPOPUP = $Msg_Serv_DisconnectHint
  248.  
  249. MenuItem M_CONNECT on MT_SERVERPOPUP
  250.   Connect
  251. EndMenuItem
  252.  
  253. MenuItem M_DISCONNECT on MT_SERVERPOPUP
  254.   Disconnect
  255. EndMenuItem
  256.  
  257. With > localized_menutree MT_NOTIFYPOPUP
  258.   M_WHOIS     <none> 0 0 @@Msg_Nick_WhoisCaption
  259.   M_WII       <none> 0 0 @@Msg_Nick_WiiCaption
  260.   M_QUERY     <none> 0 0 @@Msg_Nick_QueryCaption
  261.   M_DCC       <none> 0 0 @@Msg_Nick_DCCCaption
  262.   M_DCCCHAT   <none> 0 1 @@Msg_Nick_DCCChatCaption
  263.   M_DCCWBOARD <none> 0 1 @@Msg_Nick_DCCWboardCaption
  264.   M_DCCSEND   <none> 0 1 @@Msg_Nick_DCCSendCaption
  265.   M_TDCCSEND  <none> 0 1 @@Msg_Nick_TDCCSendCaption
  266.   M_CTCP      <none> 0 0 @@Msg_Nick_CTCPCaption
  267.   M_CTCPTIME  <none> 0 1 @@Msg_Nick_CTCPTimeCaption
  268.   M_CTCPVER   <none> 0 1 @@Msg_Nick_CTCPVerCaption
  269.   M_CTCPPING  <none> 0 1 @@Msg_Nick_CTCPPingCaption
  270. EndWith
  271.  
  272. MenuHint M_WHOIS on MT_NOTIFYPOPUP = $Msg_Nick_WhoisHint
  273. MenuHint M_WII on MT_NOTIFYPOPUP = $Msg_Nick_WiiHint
  274. MenuHint M_QUERY on MT_NOTIFYPOPUP = $Msg_Nick_QueryHint
  275. MenuHint M_DCCCHAT on MT_NOTIFYPOPUP = $Msg_Nick_DCCChatHint
  276. MenuHint M_DCCWBOARD on MT_NOTIFYPOPUP = $Msg_Nick_DCCWboardHint
  277. MenuHint M_DCCSEND on MT_NOTIFYPOPUP = $Msg_Nick_DCCSendHint
  278. MenuHint M_TDCCSEND on MT_NOTIFYPOPUP = $Msg_Nick_TDCCSendHint
  279. MenuHint M_CTCPTIME on MT_NOTIFYPOPUP = $Msg_Nick_CTCPTimeHint
  280. MenuHint M_CTCPVER on MT_NOTIFYPOPUP = $Msg_Nick_CTCPVerHint
  281. MenuHint M_CTCPPING on MT_NOTIFYPOPUP = $Msg_Nick_CTCPPingHint
  282.  
  283. MenuItem <DoubleClick> on MT_NOTIFYPOPUP
  284.   if [$1] != []
  285.     Whois $1
  286.   endif
  287. EndMenuItem
  288.  
  289. MenuItem M_WHOIS on MT_NOTIFYPOPUP
  290.   Whois $1
  291. EndMenuItem
  292.  
  293. MenuItem M_WII on MT_NOTIFYPOPUP
  294.   Wii $1
  295. EndMenuItem
  296.  
  297. MenuItem M_QUERY on MT_NOTIFYPOPUP
  298.   Query $1
  299. EndMenuItem
  300.  
  301. MenuItem M_DCCCHAT on MT_NOTIFYPOPUP
  302.   DCC Chat $1
  303. EndMenuItem
  304.  
  305. MenuItem M_DCCWBOARD on MT_NOTIFYPOPUP
  306.   DCC Whiteboard $1
  307. EndMenuItem
  308.  
  309. MenuItem M_DCCSEND on MT_NOTIFYPOPUP
  310.   DCC Send $1
  311. EndMenuItem
  312.  
  313. MenuItem M_TDCCSEND on MT_NOTIFYPOPUP
  314.   TDCC Send $1
  315. EndMenuItem
  316.  
  317. MenuItem M_CTCPTIME on MT_NOTIFYPOPUP
  318.   CTCP $1 TIME
  319. EndMenuItem
  320.  
  321. MenuItem M_CTCPVER on MT_NOTIFYPOPUP
  322.   CTCP $1 VERSION
  323. EndMenuItem
  324.  
  325. MenuItem M_CTCPPING on MT_NOTIFYPOPUP
  326.   Ping $1
  327. EndMenuItem
  328.  
  329. With > localized_menutree MT_CHANNELNICKSPOPUP
  330.   M_WHOIS     <none> 0                0 @@Msg_Nick_WhoisCaption
  331.   M_WII       <none> 0                0 @@Msg_Nick_WiiCaption
  332.   M_QUERY     <none> 0                0 @@Msg_Nick_QueryCaption
  333.   M_DCC       <none> 0                0 @@Msg_Nick_DCCCaption
  334.   M_DCCCHAT   <none> 0                1 @@Msg_Nick_DCCChatCaption
  335.   M_DCCWBOARD <none> 0                1 @@Msg_Nick_DCCWboardCaption
  336.   M_DCCSEND   <none> 0                1 @@Msg_Nick_DCCSendCaption
  337.   M_TDCCSEND  <none> 0                1 @@Msg_Nick_TDCCSendCaption
  338.   M_SEP1      <none> 0                1 -
  339.   M_DCCALLOW  <none> 0                1 @@Msg_Nick_DCCAllowCaption
  340.   M_DCCADD    <none> 0                2 @@Msg_Nick_DCCAddCaption
  341.   M_DCCDEL    <none> 0                2 @@Msg_Nick_DCCDelCaption
  342.   M_CTCP      <none> 0                0 @@Msg_Nick_CTCPCaption
  343.   M_CTCPTIME  <none> 0                1 @@Msg_Nick_CTCPTimeCaption
  344.   M_CTCPVER   <none> 0                1 @@Msg_Nick_CTCPVerCaption
  345.   M_CTCPPING  <none> 0                1 @@Msg_Nick_CTCPPingCaption
  346.   M_SEP2      <none> 0                0 -
  347.   M_OP        <none> 1                0 @@Msg_Nick_OpCaption
  348.   M_DEOP      <none> 1                0 @@Msg_Nick_DeopCaption
  349.   M_VOICE     <none> 1                0 @@Msg_Nick_VoiceCaption
  350.   M_DEVOICE   <none> 1                0 @@Msg_Nick_DevoiceCaption
  351.   M_KICK      <none> 1                0 @@Msg_Nick_KickCaption
  352.   M_KICKBAN   <none> 1                0 @@Msg_Nick_KickBanCaption
  353.   M_SEP3      <none> 0                0 -
  354.   M_IGNORE    <none> !%isignoringnick 0 @@Msg_Nick_IgnoreCaption
  355.   M_UNIGNORE  <none> %isignoringnick  0 @@Msg_Nick_UnignoreCaption
  356. EndWith
  357.  
  358. MenuHint M_WHOIS on MT_CHANNELNICKSPOPUP = $Msg_Nick_WhoisHint
  359. MenuHint M_WII on MT_CHANNELNICKSPOPUP = $Msg_Nick_WiiHint
  360. MenuHint M_QUERY on MT_CHANNELNICKSPOPUP = $Msg_Nick_QueryHint
  361. MenuHint M_DCCCHAT on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCChatHint
  362. MenuHint M_DCCWBOARD on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCWboardHint
  363. MenuHint M_DCCSEND on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCSendHint
  364. MenuHint M_TDCCSEND on MT_CHANNELNICKSPOPUP = $Msg_Nick_TDCCSendHint
  365. MenuHint M_DCCALLOW on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCAllowHint
  366. MenuHint M_DCCADD on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCAddHint
  367. MenuHint M_DCCDEL on MT_CHANNELNICKSPOPUP = $Msg_Nick_DCCDelHint
  368. MenuHint M_CTCPTIME on MT_CHANNELNICKSPOPUP = $Msg_Nick_CTCPTimeHint
  369. MenuHint M_CTCPVER on MT_CHANNELNICKSPOPUP = $Msg_Nick_CTCPVerHint
  370. MenuHint M_CTCPPING on MT_CHANNELNICKSPOPUP = $Msg_Nick_CTCPPingHint
  371. MenuHint M_OP on MT_CHANNELNICKSPOPUP = $Msg_Nick_OpHint
  372. MenuHint M_DEOP on MT_CHANNELNICKSPOPUP = $Msg_Nick_DeopHint
  373. MenuHint M_VOICE on MT_CHANNELNICKSPOPUP = $Msg_Nick_VoiceHint
  374. MenuHint M_DEVOICE on MT_CHANNELNICKSPOPUP = $Msg_Nick_DevoiceHint
  375. MenuHint M_KICK on MT_CHANNELNICKSPOPUP = $Msg_Nick_KickHint
  376. MenuHint M_KICKBAN on MT_CHANNELNICKSPOPUP = $Msg_Nick_KickBanHint
  377. MenuHint M_IGNORE on MT_CHANNELNICKSPOPUP = $Msg_Nick_IgnoreHint
  378. MenuHint M_UNIGNORE on MT_CHANNELNICKSPOPUP = $Msg_Nick_UnignoreHint
  379.  
  380. MenuItem <DoubleClick> on MT_CHANNELNICKSPOPUP
  381.   if [$1] != []
  382.     Whois $1
  383.   endif
  384. EndMenuItem
  385.  
  386. MenuItem M_WHOIS on MT_CHANNELNICKSPOPUP
  387.   foreach ($i; $listfromwords($1-))
  388.     Whois $i
  389.   endforeach
  390. EndMenuItem
  391.  
  392. MenuItem M_WII on MT_CHANNELNICKSPOPUP
  393.   foreach ($i; $listfromwords($1-))
  394.     Wii $i
  395.   endforeach
  396. EndMenuItem
  397.  
  398. MenuItem M_QUERY on MT_CHANNELNICKSPOPUP
  399.   foreach ($i; $listfromwords($1-))
  400.     Query $i
  401.   endforeach
  402. EndMenuItem
  403.  
  404. MenuItem M_DCCCHAT on MT_CHANNELNICKSPOPUP
  405.   foreach ($i; $listfromwords($1-))
  406.     DCC Chat $i
  407.   endforeach
  408. EndMenuItem
  409.  
  410. MenuItem M_DCCWBOARD on MT_CHANNELNICKSPOPUP
  411.   foreach ($i; $listfromwords($1-))
  412.     DCC Whiteboard $i
  413.   endforeach
  414. EndMenuItem
  415.  
  416. MenuItem M_DCCSEND on MT_CHANNELNICKSPOPUP
  417.   foreach ($i; $listfromwords($1-))
  418.     DCC Send $i
  419.   endforeach
  420. EndMenuItem
  421.  
  422. MenuItem M_TDCCSEND on MT_CHANNELNICKSPOPUP
  423.   foreach ($i; $listfromwords($1-))
  424.     TDCC Send $i
  425.   endforeach
  426. EndMenuItem
  427.  
  428. MenuItem M_DCCADD on MT_CHANNELNICKSPOPUP
  429.   // dccallow +nick1,+nick2,+nick3...
  430.   @l $list = $null
  431.   foreach ($i; $listfromwords($1-))
  432.     @l $list = $list,+$i
  433.   endforeach
  434.   Quote DCCALLOW $strtokr(, $list)
  435. EndMenuItem
  436.  
  437. MenuItem M_DCCDEL on MT_CHANNELNICKSPOPUP
  438.   // dccallow -nick1,-nick2,-nick3...
  439.   @l $list = $null
  440.   foreach ($i; $listfromwords($1-))
  441.     @l $list = $list,-$i
  442.   endforeach
  443.   Quote DCCALLOW $strtokr(, $list)
  444. EndMenuItem
  445.  
  446. // I would love to use a multi-variable foreach here, but some
  447. // efnet servers don't allow /msg nick1,nick2,nick3 anymore.
  448. MenuItem M_CTCPTIME on MT_CHANNELNICKSPOPUP
  449.   foreach ($i; $listfromwords($1-))
  450.     CTCP $i TIME
  451.   endforeach
  452. EndMenuItem
  453.  
  454. MenuItem M_CTCPVER on MT_CHANNELNICKSPOPUP
  455.   foreach ($i; $listfromwords($1-))
  456.     CTCP $i VERSION
  457.   endforeach
  458. EndMenuItem
  459.  
  460. MenuItem M_CTCPPING on MT_CHANNELNICKSPOPUP
  461.   foreach ($i; $listfromwords($1-))
  462.     Ping $1
  463.   endforeach
  464. EndMenuItem
  465.  
  466. MenuItem M_OP on MT_CHANNELNICKSPOPUP
  467.   foreach ($a,$b,$c,$d; $listfromwords($1-))
  468.     Mode $C +oooo $a $b $c $d
  469.   endforeach
  470. EndMenuItem
  471.  
  472. MenuItem M_DEOP on MT_CHANNELNICKSPOPUP
  473.   foreach ($a,$b,$c,$d; $listfromwords($1-))
  474.     Mode $C -oooo $a $b $c $d
  475.   endforeach
  476. EndMenuItem
  477.  
  478. MenuItem M_VOICE on MT_CHANNELNICKSPOPUP
  479.   foreach ($a,$b,$c,$d; $listfromwords($1-))
  480.     Mode $C +vvvv $a $b $c $d
  481.   endforeach
  482. EndMenuItem
  483.  
  484. MenuItem M_DEVOICE on MT_CHANNELNICKSPOPUP
  485.   foreach ($a,$b,$c,$d; $listfromwords($1-))
  486.     Mode $C -vvvv $a $b $c $d
  487.   endforeach
  488. EndMenuItem
  489.  
  490. MenuItem M_KICK on MT_CHANNELNICKSPOPUP
  491.   foreach ($i; $listfromwords($1-))
  492.     Kick $C $i
  493.   endforeach
  494. EndMenuItem
  495.  
  496. MenuItem M_KICKBAN on MT_CHANNELNICKSPOPUP
  497.   foreach ($i; $listfromwords($1-))
  498.     KB $C $i
  499.   endforeach
  500. EndMenuItem
  501.  
  502. MenuItem M_IGNORE on MT_CHANNELNICKSPOPUP
  503.   foreach ($i; $listfromwords($1-))
  504.     Ignore $i
  505.   endforeach
  506. EndMenuItem
  507.  
  508. MenuItem M_UNIGNORE on MT_CHANNELNICKSPOPUP
  509.   foreach ($i; $listfromwords($1-))
  510.     UnIgnore $i
  511.   endforeach
  512. EndMenuItem
  513.  
  514. With > localized_menutree MT_CHANNELTEXTPOPUP
  515.   M_CONTROL  <none> 0 0 "tbchanctl.bmp" @@Msg_Chan_ControlCaption
  516.   M_SEP1     <none> 0 0 -
  517.   M_BUFFER   <none> 0 0 @@Msg_Chan_BufferCaption
  518.   M_BUFCLEAR <none> 0 1 @@Msg_Chan_BufClearCaption
  519.   M_BUFSAVE  <none> 0 1 @@Msg_Chan_BufSaveCaption
  520.   M_CTCP     <none> 0 0 @@Msg_Chan_CTCPCaption
  521.   M_CTCPTIME <none> 0 1 @@Msg_Chan_CTCPTimeCaption
  522.   M_CTCPVER  <none> 0 1 @@Msg_Chan_CTCPVerCaption
  523.   M_CTCPPING <none> 0 1 @@Msg_Chan_CTCPPingCaption
  524.   M_PART     <none> 0 0 @@Msg_Chan_PartCaption
  525.   M_DOPART   <none> 0 1 "tbpart.bmp" @@Msg_Chan_DoPartCaption
  526.   M_CYCLE    <none> 0 1 "tbcycle.bmp" @@Msg_Chan_CycleCaption
  527. EndWith
  528.  
  529. MenuHint M_CONTROL on MT_CHANNELTEXTPOPUP = $Msg_Chan_ControlHint
  530. MenuHint M_BUFCLEAR on MT_CHANNELTEXTPOPUP = $Msg_Chan_BufClearHint
  531. MenuHint M_BUFSAVE on MT_CHANNELTEXTPOPUP = $Msg_Chan_BufSaveHint
  532. MenuHint M_CTCPTIME on MT_CHANNELTEXTPOPUP = $Msg_Chan_CTCPTimeHint
  533. MenuHint M_CTCPVER on MT_CHANNELTEXTPOPUP = $Msg_Chan_CTCPVerHint
  534. MenuHint M_CTCPPING on MT_CHANNELTEXTPOPUP = $Msg_Chan_CTCPPingHint
  535. MenuHint M_DOPART on MT_CHANNELTEXTPOPUP = $Msg_Chan_DoPartHint
  536. MenuHint M_CYCLE on MT_CHANNELTEXTPOPUP = $Msg_Chan_CycleHint
  537.  
  538. MenuItem <DoubleClick> on MT_CHANNELTEXTPOPUP
  539.   ChannelControl $C
  540. EndMenuItem
  541.  
  542. MenuItem M_CONTROL on MT_CHANNELTEXTPOPUP
  543.   ChannelControl $C
  544. EndMenuItem
  545.  
  546. MenuItem M_BUFCLEAR on MT_CHANNELTEXTPOPUP
  547.   Clear $C
  548. EndMenuItem
  549.  
  550. MenuItem M_BUFSAVE on MT_CHANNELTEXTPOPUP
  551.   @l $filename = $savedialog($Msg_BufSave_DialogSpec)
  552.   Halt if [$filename] == []
  553.   CreateFile $filename
  554.   @l $obj = $mapobject($C:Output)
  555.   AppendText $listquote($filename) $obj.GetText()
  556.   UnmapObject $obj
  557. EndMenuItem
  558.  
  559. MenuItem M_CTCPTIME on MT_CHANNELTEXTPOPUP
  560.   CTCP $C TIME
  561. EndMenuItem
  562.  
  563. MenuItem M_CTCPVER on MT_CHANNELTEXTPOPUP
  564.   CTCP $C VERSION
  565. EndMenuItem
  566.  
  567. MenuItem M_CTCPPING on MT_CHANNELTEXTPOPUP
  568.   Ping $C
  569. EndMenuItem
  570.  
  571. MenuItem M_DOPART on MT_CHANNELTEXTPOPUP
  572.   Part $C
  573. EndMenuItem
  574.  
  575. MenuItem M_CYCLE on MT_CHANNELTEXTPOPUP
  576.   Cycle $C
  577. EndMenuItem
  578.  
  579. With > localized_menutree MT_QUERYPOPUP
  580.   M_WHOIS     <none> 0 0 @@Msg_Nick_WhoisCaption
  581.   M_WII       <none> 0 0 @@Msg_Nick_WiiCaption
  582.   M_DCC       <none> 0 0 @@Msg_Nick_DCCCaption
  583.   M_DCCCHAT   <none> 0 1 @@Msg_Nick_DCCChatCaption
  584.   M_DCCWBOARD <none> 0 1 @@Msg_Nick_DCCWboardCaption
  585.   M_DCCSEND   <none> 0 1 @@Msg_Nick_DCCSendCaption
  586.   M_TDCCSEND  <none> 0 1 @@Msg_Nick_TDCCSendCaption
  587.   M_CTCP      <none> 0 0 @@Msg_Nick_CTCPCaption
  588.   M_CTCPTIME  <none> 0 1 @@Msg_Nick_CTCPTimeCaption
  589.   M_CTCPVER   <none> 0 1 @@Msg_Nick_CTCPVerCaption
  590.   M_CTCPPING  <none> 0 1 @@Msg_Nick_CTCPPingCaption
  591. EndWith
  592.  
  593. MenuHint M_WHOIS on MT_QUERYPOPUP = $Msg_Nick_WhoisHint
  594. MenuHint M_WII on MT_QUERYPOPUP = $Msg_Nick_WiiHint
  595. MenuHint M_DCCCHAT on MT_QUERYPOPUP = $Msg_Nick_DCCChatHint
  596. MenuHint M_DCCWBOARD on MT_QUERYPOPUP = $Msg_Nick_DCCWboardHint
  597. MenuHint M_DCCSEND on MT_QUERYPOPUP = $Msg_Nick_DCCSendHint
  598. MenuHint M_TDCCSEND on MT_QUERYPOPUP = $Msg_Nick_TDCCSendHint
  599. MenuHint M_CTCPTIME on MT_QUERYPOPUP = $Msg_Nick_CTCPTimeHint
  600. MenuHint M_CTCPVER on MT_QUERYPOPUP = $Msg_Nick_CTCPVerHint
  601. MenuHint M_CTCPPING on MT_QUERYPOPUP = $Msg_Nick_CTCPPingHint
  602.  
  603. MenuItem <DoubleClick> on MT_QUERYPOPUP
  604.   Whois $nick
  605. EndMenuItem
  606.  
  607. MenuItem M_WHOIS on MT_QUERYPOPUP
  608.   Whois $nick
  609. EndMenuItem
  610.  
  611. MenuItem M_WII on MT_QUERYPOPUP
  612.   Wii $nick
  613. EndMenuItem
  614.  
  615. MenuItem M_DCCCHAT on MT_QUERYPOPUP
  616.   DCC Chat $1
  617. EndMenuItem
  618.  
  619. MenuItem M_DCCWBOARD on MT_QUERYPOPUP
  620.   DCC Whiteboard $1
  621. EndMenuItem
  622.  
  623. MenuItem M_DCCSEND on MT_QUERYPOPUP
  624.   DCC Send $1
  625. EndMenuItem
  626.  
  627. MenuItem M_TDCCSEND on MT_QUERYPOPUP
  628.   TDCC Send $1
  629. EndMenuItem
  630.  
  631. MenuItem M_CTCPTIME on MT_QUERYPOPUP
  632.   CTCP $1 TIME
  633. EndMenuItem
  634.  
  635. MenuItem M_CTCPVER on MT_QUERYPOPUP
  636.   CTCP $1 VERSION
  637. EndMenuItem
  638.  
  639. MenuItem M_CTCPPING on MT_QUERYPOPUP
  640.   Ping $1
  641. EndMenuItem
  642.  
  643. //--------------
  644.  
  645. Event JOIN "% JOIN *"
  646.   if ($isignoring($nick!$user@$host))
  647.     @l $bmp = _joinign.bmp
  648.   else
  649.     @l $bmp = _join.bmp
  650.   endif
  651.   @l $nickstr = \b$_active(nick $nick) ($user@$_active(host $host))\b
  652.   @l $chanstr = $strtrim($2)
  653.   TextOutBitmap > $strtrim($2) ecJOIN $bmp *** $eval($Msg_JOIN)
  654.   PlayEventSound irc_join
  655. EndEvent
  656.  
  657. Event PART "% PART *"
  658.   if ([$nick] != [$N])
  659.     if ($isignoring($nick!$user@$host))
  660.       @l $bmp = _partign.bmp
  661.     else
  662.       @l $bmp = _part.bmp
  663.     endif
  664.     @l $nickstr = \b$_active(nick $nick) ($user@$_active(host $host))\b
  665.     @l $chanstr = $strtrim($2)
  666.     if ([$strtrim($3-)] == [])
  667.       @l $partmsgstr = $null
  668.     else
  669.       @l $partmsgstr = $null [$strtrim($3-)]
  670.     endif
  671.     TextOutBitmap > $strtrim($2) ecPART $bmp *** $eval($Msg_PART)
  672.   endif
  673.   PlayEventSound irc_part
  674. EndEvent
  675.  
  676. Event QUIT "% QUIT *"
  677.   @l $nickstr = \b$nick ($user@$_active(host $host))\b
  678.   @l $real_quitmsgstr = $null [$strtrim($2-)]
  679.  
  680.   if ($isignoring($nick!$user@$host))
  681.     @l $quitmsgstr = $null
  682.     @l $bitmap = _partign.bmp
  683.   else
  684.     @l $quitmsgstr = $real_quitmsgstr
  685.     @l $bitmap = _quit.bmp
  686.   endif
  687.  
  688.   @l $the_msg = $eval($Msg_QUIT)
  689.   foreach ($i; $channellist())
  690.     if ($ison($nick $i))
  691.       TextOutBitmap > $i ecQUIT $bitmap *** $the_msg
  692.     endif
  693.   endforeach
  694.  
  695.   if ($isquerying($nick))
  696.     @l $quitmsgstr = $real_quitmsgstr
  697.     TextOutBitmap > $nick ecQUIT _quit.bmp *** $eval($Msg_QUIT)
  698.   endif
  699.   PlayEventSound irc_quit
  700. EndEvent
  701.  
  702. Event NICK "% NICK *"
  703.   @l $oldnickstr = \b$nick\b
  704.   @l $newnickstr = \b$_active(nick $strtrim($2))\b
  705.   @l $the_msg = $eval($Msg_NICK)
  706.  
  707.   // don't hilite my own nick changes
  708.   if ([$nick] == [$N])
  709.     foreach ($i; $channellist())
  710.       if ($ison($nick $i))
  711.         TextOutBitmap -nohilite > $i ecNICK _nick.bmp *** $the_msg
  712.       endif
  713.     endforeach
  714.   else
  715.     foreach ($i; $channellist())
  716.       if ($ison($nick $i))
  717.         TextOutBitmap > $i ecNICK _nick.bmp *** $the_msg
  718.       endif
  719.     endforeach
  720.   endif
  721.   PlayEventSound irc_nick
  722. EndEvent
  723.  
  724. Event PRIVMSG "% PRIVMSG *"
  725.   Halt if $isignoring($nick!$user@$host)
  726.   if ($ischannel($2))
  727.     TextOut > $2 ecChanText $_nickspacing(<\b$_active(nick $nick)\b> $strtrim($3-))
  728.     PlayEventSound irc_chantext
  729.   else if ($ischannel($nicktrim($2)))
  730.     TextOut > $nicktrim($2) ecPRIVMSG $_nickspacing(*\b$nick:$2\b* $strtrim($3-))
  731.     PlayEventSound irc_chanmsg
  732.   else if ($isquerying($nick)) || ($getsetting(usequery))
  733.     TextOut > $nick ecQueryText $_nickspacing(<\b$nick\b> $strtrim($3-))
  734.     PlayEventSound irc_querytext
  735.     _IncTrayMsgCount
  736.   else
  737.     TextOut ecPRIVMSG $_nickspacing(*\b$nick\b* $strtrim($3-))
  738.     PlayEventSound irc_msg
  739.     _IncTrayMsgCount
  740.   endif
  741. EndEvent
  742.  
  743. Event NOTICE "% NOTICE *"
  744.   Halt if $isignoring($nick!$user@$host)
  745.   if ($ischannel($2))
  746.     TextOut > $2 ecNotice $_nickspacing(=\b$_active(nick $nick):$2\b= $strtrim($3-))
  747.     PlayEventSound irc_notice
  748.   else if ($ischannel($nicktrim($2)))
  749.     TextOut > $nicktrim($2) ecNOTICE $_nickspacing(=\b$nick:$2\b= $strtrim($3-))
  750.     PlayEventSound irc_chanmsg
  751.   else if ($isquerying($nick))
  752.     TextOut > $nick ecNotice $_nickspacing(=\b$nick\b= $strtrim($3-))
  753.     PlayEventSound irc_querytext
  754.   else if ($strpos(. $nick))
  755.     TextOut > . ecNotice $_nickspacing(=\b$nick\b= $strtrim($3-))
  756.     PlayEventSound irc_servernotice
  757.   else
  758.     TextOut ecNotice $_nickspacing(=\b$nick\b= $strtrim($3-))
  759.     PlayEventSound irc_notice
  760.   endif
  761. EndEvent
  762.  
  763. Event CTCPAction "% PRIVMSG % :\AACTION"
  764.   Halt if $isignoring($nick!$user@$host)
  765.   if ($ischannel($2))
  766.     TextOut > $2 ecAction  * \b$_active(nick $nick)\b $strtrim($4-)
  767.     PlayEventSound irc_chanact
  768.   else if ($isquerying($nick)) || ($getsetting(usequery))
  769.     TextOut > $nick ecAction  * \b$nick\b $strtrim($4-)
  770.     PlayEventSound irc_querytext
  771.   else
  772.     TextOut ecAction  *> \b$nick\b $strtrim($4-)
  773.     PlayEventSound irc_msg
  774.   endif
  775. EndEvent
  776.  
  777. Event CTCP "% PRIVMSG % :\A*"
  778.   Halt if $isignoring($nick!$user@$host)
  779.   @l $ctcpstr = $upper($strtrim($3))
  780.   @l $paramstr = $4-
  781.   if ($ischannel($2))
  782.     @l $nickstr = \b$_active(nick $nick)\b
  783.     TextOut > $2 ecCTCP *** $eval($Msg_CTCP_Channel)
  784.   else
  785.     @l $nickstr = \b$nick\b
  786.     TextOut ecCTCP *** $eval($Msg_CTCP_Private)
  787.   endif
  788.   PlayEventSound irc_ctcp
  789. EndEvent
  790.  
  791. Event RCTCP "% NOTICE % :\A*"
  792.   Halt if $isignoring($nick!$user@$host)
  793.   @l $ctcpstr = $upper($strtrim($3))
  794.   @l $nickstr = \b$nick\b
  795.   @l $paramstr = $4-
  796.   TextOut ecCTCP *** $eval($Msg_RCTCP)
  797.   PlayEventSound irc_rctcp
  798. EndEvent
  799.  
  800. Event CTCPVersion "% PRIVMSG % :\AVERSION"
  801.   Halt if $isignoring($nick!$user@$host)
  802.   if ($LibBuild == $build)
  803.     ^RCTCP $nick VERSION Visual IRC $ver ($MessageLanguage) - $Msg_CTCPVersion_Slogan http://www.visualirc.net/features.php
  804.   else
  805.     ^RCTCP $nick VERSION Visual IRC $ver ($MessageLanguage) $eval($Msg_CTCPVersion_Library) - $Msg_CTCPVersion_Slogan http://www.visualirc.net/features.php
  806.   endif
  807.   FallThrough
  808. EndEvent
  809.  
  810. Event CTCPSource "% PRIVMSG % :\ASOURCE"
  811.   Halt if $isignoring($nick!$user@$host)
  812.   ^RCTCP $nick SOURCE http://www.visualirc.net/
  813.   if [${Msg_CTCPSource_Translation}] != []
  814.     ^RCTCP $nick SOURCE $Msg_CTCPSource_Translation
  815.   endif
  816.   FallThrough
  817. EndEvent
  818.  
  819. Event CTCPTime "% PRIVMSG % :\ATIME"
  820.   Halt if $isignoring($nick!$user@$host)
  821.   ^RCTCP $nick TIME $time($Msg_Time_FullFormat)
  822.   FallThrough
  823. EndEvent
  824.  
  825. Event Ping "% PRIVMSG % :\APING"
  826.   Halt if $isignoring($nick!$user@$host)
  827.   // no output
  828.   if !($strpos(+++ $4-))
  829.     ^RCTCP $nick PING $4-
  830.     PlayEventSound irc_ping
  831.   endif
  832. EndEvent
  833.  
  834. Event CTCPFinger "% PRIVMSG % :\AFINGER"
  835.   Halt if $isignoring($nick!$user@$host)
  836.   @l $idlestr = $decodeinterval($idletime())
  837.   ^RCTCP $nick FINGER $eval($Msg_CTCPFinger_Reply)
  838.   FallThrough
  839. EndEvent
  840.  
  841. Event CTCPUserInfo "% PRIVMSG % :\AUSERINFO"
  842.   Halt if $isignoring($nick!$user@$host)
  843.   @l $info = $getservsetting(userinfo)
  844.   if ([$info] == [])
  845.     @l $info = $getnetsetting(userinfo)
  846.   endif
  847.   if ([$info] == [])
  848.     @l $info = $getsetting(userinfo)
  849.   endif
  850.   ^RCTCP $nick USERINFO $info
  851.   FallThrough
  852. EndEvent
  853.  
  854. Event CTCPClientInfo "% PRIVMSG % :\ACLIENTINFO"
  855.   Halt if $isignoring($nick!$user@$host)
  856.   switch $4
  857.     case :
  858.       @l $cmdsstr = PING,TIME,VERSION,SOURCE,FINGER,USERINFO,CLIENTINFO
  859.       ^RCTCP $nick CLIENTINFO :$eval($Msg_CTCPClientInfo_Help)
  860.     case PING:
  861.       ^RCTCP $nick CLIENTINFO PING :$Msg_CTCPClientInfo_Ping
  862.     case TIME:
  863.       ^RCTCP $nick CLIENTINFO TIME :$Msg_CTCPClientInfo_Time
  864.     case VERSION:
  865.       ^RCTCP $nick CLIENTINFO VERSION :$Msg_CTCPClientInfo_Version
  866.     case SOURCE:
  867.       ^RCTCP $nick CLIENTINFO SOURCE :$Msg_CTCPClientInfo_Source
  868.     case FINGER:
  869.       ^RCTCP $nick CLIENTINFO FINGER :$Msg_CTCPClientInfo_Finger
  870.     case USERINFO:
  871.       ^RCTCP $nick CLIENTINFO USERINFO :$Msg_CTCPClientInfo_UserInfo
  872.     case CLIENTINFO:
  873.       ^RCTCP $nick CLIENTINFO CLIENTINFO :$Msg_CTCPClientInfo_ClientInfo
  874.     case else
  875.       ^RCTCP $nick ERRMSG CLIENTINFO $4 :$Msg_CTCPClientInfo_Unknown
  876.   endswitch
  877.   FallThrough
  878. EndEvent
  879.  
  880. Event PingReply "% NOTICE % :\APING"
  881.   Halt if $isignoring($nick!$user@$host)
  882.   @l $nickstr = \b$nick\b
  883.   @l $timestr = $decodepinginterval($4)
  884.   TextOut ecCTCP *** $eval($Msg_RCTCPPing)
  885.   PlayEventSound irc_rping
  886. EndEvent
  887.  
  888. Event KICK "% KICK *"
  889.   @l $kickmsgstr = $null [$strtrim($4-)]
  890.   if !($getsetting(AutoRejoin)) && ([$3] == [$N])
  891.     @l $chanstr = \b$2\b
  892.     @l $nickstr = \b$nick\b
  893.     TextOut > . ecKICK *** $eval($Msg_KICK_Self)
  894.   else
  895.     @l $chanstr = $2
  896.     @l $nickstr = \b$_active(nick $nick)\b
  897.     @l $victimstr = \b$3\b
  898.     TextOut > $2 ecKICK *** $eval($Msg_KICK_Other)
  899.   endif
  900.   PlayEventSound irc_kick
  901. EndEvent
  902.  
  903. Event MODE "% MODE *"
  904.   if ($ischannel($2))
  905.     @l $modestr = $_active(mode $strtrim($3-))
  906.     @l $chanstr = $2
  907.     @l $nickstr = \b$_active(nick $nick)\b
  908.     TextOutBitmap > $2 ecMODE _mode.bmp *** $eval($Msg_MODE)
  909.     PlayEventSound irc_mode
  910.   endif
  911. EndEvent
  912.  
  913. Event ERROR "ERROR *"
  914.   TextOut > . ecERROR $Msg_Notice_Error: $strtrim($1-)
  915. EndEvent
  916.  
  917. Event RawNotice "NOTICE *"
  918.   TextOut > . ecNotice [\b$Msg_Notice_Raw\b]\t$strtrim($1-)
  919.   PlayEventSound irc_servernotice
  920. EndEvent
  921.  
  922. Event AuthNotice "NOTICE AUTH *"
  923.   TextOut > . ecNotice [\b$Msg_Notice_Auth\b]\t$strtrim($2-)
  924.   PlayEventSound irc_servernotice
  925. EndEvent
  926.  
  927. Event TOPIC "% TOPIC *"
  928.   @l $nickstr = \b$_active(nick $nick)\b
  929.   @l $chanstr = $2
  930.   @l $topicstr = $strtrim($3-)
  931.   TextOutBitmap > $2 ecTOPIC _topic.bmp *** $eval($Msg_TOPIC)
  932.   PlayEventSound irc_topic
  933. EndEvent
  934.  
  935. Event INVITE "% INVITE *"
  936.   @l $nickstr = \b$nick ($user@$_active(host $host))\b
  937.   @l $chanstr = \b$_active(invite $strtrim($3))\b
  938.   TextOut ecNotice *** $eval($Msg_INVITE)
  939.   PlayEventSound irc_invite
  940. EndEvent
  941.  
  942. Event WALLOPS "% WALLOPS *"
  943.   TextOut > . ecNotice $_nickspacing(!\b$nick\b! $strtrim($2-))
  944. EndEvent
  945.  
  946. // DCC <type> <filename> <encoded-ip> <port> [size] <revtoken><flags>
  947. Event DCCRequest "% PRIVMSG % :\ADCC *"
  948.   // nuh PRIVMSG % :\ADCC SEND "filename.ext" encodedip port [length [flags]]
  949.   //  0   1      2    3     4         5          6       7     8       9
  950.   Halt if $isignoring($nick!$user@$host)
  951.   if !($ischannel($2))
  952.     @l $nohalt = 0
  953.     // new TDCC send syntax
  954.     Parse Extended $0-
  955.       if ([$4] == [SEND]) && ($strpos(T $9) != 0)
  956.         @l $word = TSEND
  957.       else
  958.         @l $word = $4
  959.       endif
  960.     EndParse
  961.     switch $word
  962.       case CHAT:
  963.         if ([$5] == [wboard])
  964.           DCC Request WBOARD $nick $user@$host $6-
  965.           @l $typestr = $Msg_DCCType_Chat
  966.         else
  967.           DCC Request CHAT $nick $user@$host $6-
  968.           @l $typestr = $Msg_DCCType_Wboard
  969.         endif
  970.         @l $nickstr = \b$nick ($user@$_active(host $host))\b
  971.         @l $addrstr = $decodeip($6):$7
  972.         TextOutBitmap ecDCC _dcc.bmp *** $eval($Msg_DCC_ChatRequest)
  973.       case SEND:
  974.         DCC Request SEND $nick $user@$host $5-
  975.         Parse Extended $5-
  976.           if ([$3] == [])
  977.             @l $len = $null
  978.           else
  979.             @l $sizestr = $3
  980.             @l $len = $eval($Msg_DCC_FileSize)
  981.           endif
  982.           @l $typestr = $Msg_DCCType_Send
  983.           @l $nickstr = \b$nick ($user@$_active(host $host))\b
  984.           @l $addrstr = $decodeip($1):$2
  985.           @l $filestr = $0$len
  986.           TextOutBitmap ecDCC _dcc.bmp *** $eval($Msg_DCC_FileRequest)
  987.         EndParse
  988.       case TSEND:
  989.         DCC Request TSEND $nick $user@$host $5-
  990.         Parse Extended $5-
  991.           @l $typestr = $Msg_DCCType_TSend
  992.           @l $nickstr = \b$nick ($user@$_active(host $host))\b
  993.           @l $addrstr = $decodeip($1):$2
  994.  
  995.           @l $sizestr = $3
  996.           @l $filestr = $0$eval($Msg_DCC_FileSize)
  997.           TextOutBitmap ecDCC _dcc.bmp *** $eval($Msg_DCC_FileRequest)
  998.         EndParse
  999.       case multi RESUME,ACCEPT
  1000.         // ignore - this is handled by the client
  1001.         @l $nohalt = 1
  1002.       case else
  1003.         ^RCTCP $nick ERRMSG DCC :$Msg_DCC_UnknownType
  1004.         @l $typestr = DCC $upper($4)
  1005.         @l $nickstr = \b$nick ($user@$_active(host $host))\b
  1006.         @l $paramstr = $5-
  1007.         TextOutBitmap ecDCC _dcc.bmp *** $eval($Msg_DCC_UnknownRequest)
  1008.     endswitch
  1009.     Halt if !($nohalt)
  1010.   endif
  1011.   FallThrough
  1012. EndEvent
  1013.  
  1014. //--------------
  1015.  
  1016. Event RPL_Away "% 301 *"
  1017.   @l $nickstr = \b$3\b
  1018.   @l $awaystr = \b$strtrim($4-)\b
  1019.   if ([$WhoisTense] == [$$WhoisTense])
  1020.     TextOut ecNotice *** $eval($Msg_Rpl_Away)
  1021.   else
  1022.     TextOut clOlive *** $eval($Msg_Rpl_Away)
  1023.   endif
  1024. EndEvent
  1025.  
  1026. Event RPL_WhoisRegNick "% 307 *"
  1027.   @l $nickstr = \b$3\b
  1028.   TextOut clOlive *** $eval($Msg_Rpl_WhoisRegNick)
  1029. EndEvent
  1030.  
  1031. Event RPL_WhoisAdmin "% 308 *"
  1032.   @l $nickstr = \b$3\b
  1033.   TextOut clOlive *** $eval($Msg_Rpl_WhoisAdmin)
  1034. EndEvent
  1035.  
  1036. Event RPL_WhoisSAdmin "% 309 *"
  1037.   @l $nickstr = \b$3\b
  1038.   TextOut clOlive *** $eval($Msg_Rpl_WhoisSAdmin)
  1039. EndEvent
  1040.  
  1041. Event RPL_WhoisHelpOp "% 310 *"
  1042.   @l $nickstr = \b$3\b
  1043.   TextOut clOlive *** $eval($Msg_Rpl_WhoisHelpOp)
  1044. EndEvent
  1045.  
  1046. Event RPL_WhoisUser "% 311 *"
  1047.   @ $WhoisTense = $Msg_WhoisTense_Is
  1048.   @l $nickstr = \b$3\b
  1049.   @l $uhoststr = \b$4@$_active(host $5)\b
  1050.   @l $ircnamestr = $strtrim($7-)
  1051.   TextOut clOlive *** $eval($Msg_Rpl_WhoisUser)
  1052. EndEvent
  1053.  
  1054. Event RPL_WhoisServer "% 312 *"
  1055.   @l $nickstr = \b$3\b
  1056.   @l $servstr = \b$4\b
  1057.   @l $descstr = $strtrim($5-)
  1058.   TextOut clOlive *** $eval($Msg_Rpl_WhoisServer)
  1059. EndEvent
  1060.  
  1061. Event RPL_WhoisOper "% 313 *"
  1062.   @l $nickstr = \b$3\b
  1063.   TextOut clOlive *** $eval($Msg_Rpl_WhoisOper)
  1064. EndEvent
  1065.  
  1066. Event RPL_WhowasUser "% 314 *"
  1067.   @ $WhoisTense = $Msg_WhoisTense_Was
  1068.   @l $nickstr = \b$3\b
  1069.   @l $uhoststr = \b$4@$_active(host $5)\b
  1070.   @l $ircnamestr = $strtrim($7-)
  1071.   TextOut clOlive *** $eval($Msg_Rpl_WhowasUser)
  1072. EndEvent
  1073.  
  1074. Event RPL_WhoisIdle "% 317 *"
  1075.   @l $nickstr = \b$3\b
  1076.   @l $timestr = \b$decodeinterval($4)\b
  1077.   TextOut clOlive *** $eval($Msg_Rpl_WhoisIdle)
  1078. EndEvent
  1079.  
  1080. Event RPL_EndOfWhois "% 318 *"
  1081.   -@ $WhoisTense
  1082. EndEvent
  1083.  
  1084. Event RPL_WhoisChannels "% 319 *"
  1085.   @l $nickstr = \b$3\b
  1086.   @l $chansstr = $strtrim($4-)
  1087.   TextOut clOlive *** $eval($Msg_Rpl_WhoisChannels)
  1088. EndEvent
  1089.  
  1090. Event RPL_Whois320 "% 320 *"
  1091.   TextOut clOlive *** \b$3\b $strtrim($4-)
  1092. EndEvent
  1093.  
  1094. Event RPL_WhoisAccount "% 330 *"
  1095.   // this event gives the services login username
  1096.   @l $nickstr = \b$3\b
  1097.   @l $accountstr = $strtrim($4)
  1098.   TextOut clOlive *** $eval($Msg_Rpl_WhoisAccount)
  1099. EndEvent
  1100.  
  1101. Event RPL_WhoisRealHost "% 338 *"
  1102.   // this event gives the real uhost/ip for undernet's umode +x
  1103.   @l $nickstr = \b$3\b
  1104.   @l $realhost = $4
  1105.   @l $realip = $5
  1106.   TextOut clOlive *** $eval($Msg_Rpl_WhoisRealHost)
  1107. EndEvent
  1108.  
  1109. Event RPL_EndOfWhowas "% 369 *"
  1110.   -@ $WhoisTense
  1111. EndEvent
  1112.  
  1113. Event RPL_ChannelURL "% 328 *"
  1114.   @l $chanstr = $3
  1115.   @l $urlstr = $strtrim($4-)
  1116.   TextOut > $3 ecNotice *** $eval($Msg_Rpl_ChannelURL)
  1117. EndEvent
  1118.  
  1119. Event RPL_NoTopic "% 331 *"
  1120.   @l $chanstr = $3
  1121.   TextOut > $3 ecNotice *** $eval($Msg_Rpl_NoTopic)
  1122. EndEvent
  1123.  
  1124. Event RPL_TopicIs "% 332 *"
  1125.   @l $chanstr = $3
  1126.   @l $topicstr = $strtrim($4-)
  1127.   TextOut > $3 ecNotice *** $eval($Msg_Rpl_TopicIs)
  1128. EndEvent
  1129.  
  1130. Event RPL_TopicSetBy "% 333 *"
  1131.   @l $nickstr = \b$4\b
  1132.   @l $timestr = \b$unixtime($5 $Msg_Time_LongFormat)\b
  1133.   TextOut > $3 ecNotice *** Topic set by \b$4\b on \b$unixtime($5 ddd mmm d h:nn ampm)\b
  1134. EndEvent
  1135.  
  1136. Event RPL_LusersUserCount "% 251 *"
  1137.   TextOut > . ecNotice *** $strtrim($3-)
  1138. EndEvent
  1139.  
  1140. Event RPL_LusersOperCount "% 252 *"
  1141.   TextOut > . ecNotice *** $3 $strtrim($4-)
  1142. EndEvent
  1143.  
  1144. Event RPL_LusersUnknownConn "% 253 *"
  1145.   TextOut > . ecNotice *** $3 $strtrim($4-)
  1146. EndEvent
  1147.  
  1148. Event RPL_LusersChanCount "% 254 *"
  1149.   TextOut > . ecNotice *** $3 $strtrim($4-)
  1150. EndEvent
  1151.  
  1152. Event RPL_LusersConnCount "% 255 *"
  1153.   TextOut > . ecNotice *** $strtrim($3-)
  1154. EndEvent
  1155.  
  1156. Event RPL_LusersLocalUsers "% 265 *"
  1157.   TextOut > . ecNotice *** $strtrim($3-)
  1158. EndEvent
  1159.  
  1160. Event RPL_LusersGlobalUsers "% 266 *"
  1161.   TextOut > . ecNotice *** $strtrim($3-)
  1162. EndEvent
  1163.  
  1164. //--------------
  1165.  
  1166. Event ERR_NoSuchNick "% 401 *"
  1167.   @l $nickstr = \b$3\b
  1168.   TextOut ecError *** $eval($Msg_Err_NoSuchNick)
  1169. EndEvent
  1170.  
  1171. Event ERR_NoSuchServer "% 402 *"
  1172.   @l $serverstr = \b$3\b
  1173.   TextOut ecError *** $eval($Msg_Err_NoSuchServer)
  1174. EndEvent
  1175.  
  1176. Event ERR_WasNoSuchNick "% 406 *"
  1177.   @l $nickstr = \b$3\b
  1178.   TextOut ecError *** $eval($Msg_Err_WasNoSuchNick)
  1179. EndEvent
  1180.  
  1181. Event ERR_UnknownCommand "% 421 *"
  1182.   @l $cmdstr = $3
  1183.   TextOut ecError *** $eval($Msg_Err_UnknownCommand)
  1184. EndEvent
  1185.  
  1186. Event ERR_NicknameInUse "% 433 *"
  1187.   @l $nickstr = \b$3\b
  1188.   TextOut ecError *** $eval($Msg_Err_NicknameInUse)
  1189. EndEvent
  1190.  
  1191. Event ERR_BanNickChange "% 437 *"
  1192.   @l $chanstr = $3
  1193.   TextOut ecError *** $eval($Msg_Err_BanNickChange)
  1194. EndEvent
  1195.  
  1196. Event ERR_NChangeTooFast "% 438 *"
  1197.   TextOut ecError *** $strtrim($4-)
  1198. EndEvent
  1199.  
  1200. Event ERR_ServicesDown "% 440 *"
  1201.   TextOut ecError *** $Msg_Err_ServicesDown
  1202. EndEvent
  1203.  
  1204. Event ERR_NeedReggedNick "% 477 *"
  1205.   @l $chanstr = \b$3\b
  1206.   TextOut ecError *** $eval($Msg_Err_NeedReggedNick)
  1207. EndEvent
  1208.  
  1209. Event ERR_BanListFull "% 478 *"
  1210.   @l $chanstr = \b$3\b
  1211.   TextOut ecError *** $eval($Msg_Err_BanListFull)
  1212. EndEvent
  1213.  
  1214. Event ERR_UserNotInChannel "% 441 *"
  1215.   @l $nickstr = $3
  1216.   @l $chanstr = $4
  1217.   TextOut > $4,. ecError *** $eval($Msg_Err_UserNotInChannel)
  1218. EndEvent
  1219.  
  1220. Event ERR_NotOnChannel "% 442 *"
  1221.   @l $chanstr = $3
  1222.   TextOut > $3,. ecError *** $eval($Msg_Err_NotOnChannel)
  1223. EndEvent
  1224.  
  1225. Event ERR_ChannelIsFull "% 471 *"
  1226.   @l $chanstr = $3
  1227.   TextOut > $3,. ecError *** $eval($Msg_Err_ChannelIsFull)
  1228. EndEvent
  1229.  
  1230. Event ERR_InviteOnlyChan "% 473 *"
  1231.   @l $chanstr = $3
  1232.   TextOut > $3,. ecError *** $eval($Msg_Err_InviteOnlyChan)
  1233. EndEvent
  1234.  
  1235. Event ERR_BannedFromChan "% 474 *"
  1236.   @l $chanstr = $3
  1237.   TextOut > $3,. ecError *** $eval($Msg_Err_BannedFromChan)
  1238. EndEvent
  1239.  
  1240. Event ERR_BadChannelKey "% 475 *"
  1241.   @l $chanstr = $3
  1242.   TextOut > $3,. ecError *** $eval($Msg_Err_BadChannelKey)
  1243. EndEvent
  1244.  
  1245. Event ERR_ChanOPrivsNeeded "% 482 *"
  1246.   @l $chanstr = $3
  1247.   TextOut > $3,. ecError *** $eval($Msg_Err_ChanOPrivsNeeded)
  1248. EndEvent
  1249.  
  1250. //--------------
  1251.  
  1252. Event <default> "*"
  1253.   if ($getsetting(showraw))
  1254.     TextOut > . ecServText $0-
  1255.   else
  1256.     TextOut > . ecServText $strtrim($3-)
  1257.   endif
  1258. EndEvent
  1259.  
  1260. Event StartMOTD "% 375 *"
  1261.   TextOut > . ecServText \f$strtrim($3-)
  1262. EndEvent
  1263.  
  1264. Event MOTD "% 372 *"
  1265.   TextOut > . ecServText \f$strtrim($3-)
  1266. EndEvent
  1267.  
  1268. Event EndMOTD "% 376 *"
  1269.   TextOut > . ecServText \f$strtrim($3-)
  1270. EndEvent
  1271.  
  1272. //--------------
  1273.  
  1274. // read 005 numeric for server capabilities
  1275.  
  1276. Event RPL_ServerCaps -after "% 005 *"
  1277.   @l $caps = $listfromwords($3-)
  1278.  
  1279.   foreach ($i; $caps)
  1280.     @l $name = $strtokl(= $i)
  1281.     @l $value = $strtokr(= $i)
  1282.     switch $name
  1283.       case PREFIX:
  1284.         // $value = (ohv)@%+
  1285.         // add any new modes to NLX
  1286.  
  1287.         @l $rparen = )
  1288.         @l $modechars = $strtokl($rparen $value)
  1289.         if [$substr($modechars 1 1)] == [(]
  1290.           @l $modechars = $substr($modechars 2 99)
  1291.         endif
  1292.         @l $namesmarks = $strtokr($rparen $value)
  1293.  
  1294.         @l $cnt = $length($modechars)
  1295.         if $length($namesmarks) < $cnt
  1296.           @l $cnt = $length($namesmarks)
  1297.         endif
  1298.  
  1299.         for (@l $i = 1; $i <= $cnt; $i++)
  1300.           @l $mc = $substr($modechars $i 1)
  1301.           if [$nlflaginfo($mc)] == []
  1302.             ^NLAddFlag $mc $substr($namesmarks $i 1)
  1303.             TextOut > . ecScript *** Added nick list flag +$mc
  1304.           endif
  1305.         endfor
  1306.     endswitch
  1307.   endforeach
  1308. EndEvent
  1309.  
  1310. //--------------
  1311.  
  1312. // support for TMS tables
  1313.  
  1314. Event <OnCreateWindow_inittables> "*"
  1315.   if [$0] == [TDCCChatForm]
  1316.     // use the unique name
  1317.     @l $win = $2
  1318.   else
  1319.     @l $win = $1
  1320.   endif
  1321.   
  1322.   if !$InitializedTables
  1323.     // channel text table
  1324.     TextOut > $win clBlack \S@td/w:chantext:12ch:?\S
  1325.     // timer list table
  1326.     TextOut > $win clBlack \S@td/w:timers:2ch:8ch:10ch:3ch:?\S
  1327.     
  1328.     @ $InitializedTables = 1
  1329.   endif
  1330.   
  1331.   // set default table
  1332.   TextOut > $win clBlack \S@setdeft:chantext\S
  1333. EndEvent
  1334.  
  1335. Alias _NICKSPACING
  1336.   // 0=space, 1=tab, 2=table
  1337.   switch $getsetting(nickspacing)
  1338.     case 0:
  1339.       @ $fresult = $1 $2-
  1340.     case 1:
  1341.       @ $fresult = $1\t$2-
  1342.     case 2:
  1343.       @ $fresult = \S@col\S$1\S@col\S$2-
  1344.   endswitch
  1345. EndAlias
  1346.  
  1347. // show the timers in a nice table format
  1348. Alias TIMERS
  1349.   if [$1] == [all]
  1350.     @l $sid = $null
  1351.   else
  1352.     @l $sid = $currentserver()
  1353.   endif
  1354.   
  1355.   TextOut > $C clBlack \S@pusht:timers\S
  1356.   TextOut > $C ecScript \b\u\S@col\S$Msg_Timers_Svr\S@col\S$Msg_Timers_Name\S@col\S$Msg_Timers_Interval\S@col\S$Msg_Timers_Rpt\S@col\S$Msg_Timers_Command\u\b
  1357.   
  1358.   @l $list = $timerlist($sid)
  1359.   // server ID : timer name : interval : repeats : command
  1360.   foreach ($i; $list)
  1361.     @l $info = $gettimer($i)
  1362.     @l $id = $gettimerserver($i)
  1363.     Parse $info
  1364.       // $0=interval (ms), $1=repeats, $2- = command
  1365.       if $0 % 1000 == 0
  1366.         @l $interval = $($0 / 1000) $Msg_Time_sec
  1367.       else
  1368.         @l $interval = $0 $Msg_Time_ms
  1369.       endif
  1370.       TextOut > $C ecScript \S@col\S$id\S@col\S$i\S@col\S$interval\S@col\S$1\S@col\S$2-
  1371.     EndParse
  1372.   endforeach
  1373.   
  1374.   TextOut > $C ecScript \S@popt\S$Msg_List_End
  1375. EndAlias
  1376.  
  1377. //--------------
  1378.  
  1379. // output for built-in commands
  1380. // these get the target in $0 and the text in $1-
  1381.  
  1382. Event <OnMyChanText> "*"
  1383.   TextOut > $C ecMyChanText $_nickspacing([\b$N\b] $1-)
  1384. EndEvent
  1385.  
  1386. Event <OnMyPrivMsg> "*"
  1387.   TextOut > $C ecPRIVMSG  -> $_nickspacing(*\b$0\b* $1-)
  1388. EndEvent
  1389.  
  1390. Event <OnMyNotice> "*"
  1391.   TextOut > $C ecNotice  -> $_nickspacing(=\b$0\b= $1-)
  1392. EndEvent
  1393.  
  1394. Event <OnMyCTCP> "*"
  1395.   TextOut > $C ecCTCP  -> $_nickspacing({\b$0\b} CTCP $1-)
  1396. EndEvent
  1397.  
  1398. Event <OnMyRCTCP> "*"
  1399.   TextOut > $C ecCTCP  -> $_nickspacing({\b$0\b} RCTCP $1-)
  1400. EndEvent
  1401.  
  1402. Event <OnMyChanAction> "*"
  1403.   TextOut > $C ecAction  * \b$N\b $1-
  1404. EndEvent
  1405.  
  1406. Event <OnMyPrivAction> "*"
  1407.   TextOut > $C ecAction  -> \b$0\b\t*> \b$N\b $1-
  1408. EndEvent
  1409.  
  1410. Event <OnMyQueryText> "*"
  1411.   TextOut > $C ecMyQueryText $_nickspacing([\b$N\b] $1-)
  1412. EndEvent
  1413.  
  1414. Event <OnMyQueryAction> "*"
  1415.   TextOut > $C ecAction  * \b$N\b $1-
  1416. EndEvent
  1417.  
  1418. // <OnNewDCCChatText> events get the nick in $0, the window name in $1,
  1419. // and the text in $2-.
  1420.  
  1421. Event <OnNewDCCChatText_Action> "% % \AACTION"
  1422.   TextOut > $1 ecAction  * \b$nick\b $strtrim($3-)
  1423.   PlayEventSound dcc_chattext
  1424. EndEvent
  1425.  
  1426. Event <OnNewDCCChatText_Chat> "*"
  1427.   TextOut > $1 ecQueryText $_nickspacing(<\b$nick\b> $2-)
  1428.   PlayEventSound dcc_chattext
  1429. EndEvent
  1430.  
  1431. Event <OnDCCChatClosed> "*"
  1432.   TextOut > $1 ecDCC *** $Msg_DCC_ClosedByRemote
  1433. EndEvent
  1434.  
  1435. // <OnDCCRequest> event is run when a DCC request is added to the list (with
  1436. // the DCC Request command). the event can respond with DCC Accept [filename],
  1437. // DCC Resume <size> [filename], or DCC Reject.. or do nothing to leave it in
  1438. // the list. if filename is omitted, the default filename is used.
  1439.  
  1440. Event <OnDCCRequest_sound> "*"
  1441.   PlayEventSound virc_dcc
  1442. EndEvent
  1443.  
  1444. Event <OnDCCRequest> "*"
  1445.   // params: :n!u@h type(CHAT,SEND,TSEND) ip port size filename
  1446.   @l $ext = $rstrtokr(. $5-)
  1447.   if ($getsetting(dccautoacceptchat)) && ([$1] == [CHAT])
  1448.     // accept all chats
  1449.     DCC Accept
  1450.   else if ($getsetting(dccautoacceptsend)) && (([$1] == [SEND]) || ([$1] == [TSEND]))
  1451.     // leave in DCC list if it's a dangerous extension
  1452.     if ($isinset([$ext] [$getsetting(dccwarnexts)]))
  1453.       // show the dialog for 5 minutes, then hide it
  1454.       @l $nickstr = $nick ($user@$host)
  1455.       @l $filestr = $5-
  1456.       @l $extstr = $ext
  1457.       @l $warndlg = $new(TMessageDialog $eval($Msg_DCC_AutoWarnExtDialog) mtWarning [mbYes,mbNo])
  1458.       ^Delay dcc_warndlg_$warndlg 300 @p $warndlg.ModalResult = 7
  1459.       try
  1460.         @l $result = $warndlg.ShowModal()
  1461.         // 6 = Yes, 7 = No
  1462.         Halt if $result == 7
  1463.         ^UnDelay dcc_warndlg_$warndlg
  1464.       finally
  1465.         SafeDestroy $warndlg
  1466.       endtry
  1467.       ^UnDelay dcc_warndlg_$warndlg
  1468.     endif
  1469.     // does the file already exist?
  1470.     @l $fn = $getpath(download)$5-
  1471.     if ($fileexists($fn))
  1472.       // yes.. if our copy is smaller and this isn't a dangerous extension,
  1473.       // resume. otherwise pick a new filename.
  1474.       if ($getsetting(dccautoresume)) && ($getfilesize($fn) < $4) && ($isinset([$ext] [$getsetting(dccwarnexts)]) == 0)
  1475.         DCC Resume $getfilesize($fn) $fn
  1476.       else
  1477.         @l $i = 1
  1478.         while 1
  1479.           break if !($fileexists($getpath(download)$i $5-))
  1480.           $i++
  1481.         endwhile
  1482.         DCC Accept $getpath(download)$i $5-
  1483.       endif
  1484.     else
  1485.       DCC Accept $fn
  1486.     endif
  1487.   else
  1488.     if ($isinset([$ext] [$getsetting(dccwarnexts)]))
  1489.       @l $nickstr = $nick ($user@$host)
  1490.       @l $filestr = $5-
  1491.       @l $extstr = $ext
  1492.       @l $msg = $eval($Msg_DCC_WarnExtDialog)
  1493.       if ($messagedlg(52 $msg) != 6)
  1494.         DCC Reject
  1495.       endif
  1496.     endif
  1497.   endif
  1498. EndEvent
  1499.  
  1500. //--------------
  1501.  
  1502. Event <OnNotifyJoin> "*"
  1503.   @l $nickstr = $0
  1504.   @l $msg = $eval($Msg_Notify_Join)
  1505.   TextOut > . ecNotice *** $msg
  1506.   if ($isquerying($0))
  1507.     TextOut > $0 ecNotice *** $msg
  1508.   endif
  1509.   PlayEventSound notify_join
  1510. EndEvent
  1511.  
  1512. Event <OnNotifyQuit> "*"
  1513.   @l $nickstr = $0
  1514.   @l $msg = $eval($Msg_Notify_Quit)
  1515.   TextOut > . ecNotice *** $msg
  1516.   if ($isquerying($0))
  1517.     TextOut > $0 ecNotice *** $msg
  1518.   endif
  1519.   PlayEventSound notify_quit
  1520. EndEvent
  1521.  
  1522. Event <OnConnect_firehooks> "*"
  1523.   foreach ($i; $arrayvalues($ConnectHooks))
  1524.     $i
  1525.   endforeach
  1526.   @ $ConnectHooks = $null
  1527. EndEvent
  1528.  
  1529. Alias _RunAutoPerform
  1530.   halt if [$1-] == []
  1531.   @l $TS = $new(TStringList)
  1532.   foreach ($i; $1-)
  1533.     $TS.Add $i
  1534.   endforeach
  1535.   $TS.Execute
  1536.   Destroy $TS
  1537. EndAlias
  1538.  
  1539. Alias ShiftKeys_Active
  1540.   // ignore shift keys if ViRC isn't the active application
  1541.   @l $obj = $mapobject(!Application)
  1542.   if [$prop($obj.Active)] == [False]
  1543.     @ $fresult = []
  1544.   else
  1545.     @ $fresult = $shiftkeys()
  1546.   endif
  1547.   UnmapObject $obj
  1548. EndAlias
  1549.  
  1550. Event <OnConnect_virclib> "*"
  1551.   PlayEventSound virc_connect
  1552.   @l $umode = $getservsetting(defumode)
  1553.   if ([$umode] == [])
  1554.     @l $umode = $getnetsetting(defumode)
  1555.   endif
  1556.   if ([$umode] == [])
  1557.     @l $umode = $getsetting(defumode)
  1558.   endif
  1559.   if ([$umode] != [])
  1560.     Umode $umode
  1561.   endif
  1562.  
  1563.   // start keepalive timer
  1564.   ^Timer keepalive_$getwindowid(.) 300 0 eval raw -idle PONG :$$server
  1565.  
  1566.   // autoperform comes before autojoin
  1567.   _RunAutoPerform $getnetsetting(autoperform)
  1568.   _RunAutoPerform $getservsetting(autoperform)
  1569.   
  1570.   if !($isinset([shift] $shiftkeys_active()))
  1571.     @l $autojoin = $getservsetting(autojoin)
  1572.     if ([$autojoin] == [])
  1573.       @l $autojoin = $getnetsetting(autojoin)
  1574.     endif
  1575.     if ([$autojoin] == [])
  1576.       @l $autojoin = $getsetting(autojoin)
  1577.     endif
  1578.     if ([$autojoin] != [])
  1579.       Join $autojoin
  1580.       if ($getsetting(hideonautojoin))
  1581.         Hide .
  1582.       endif
  1583.     endif
  1584.   endif
  1585. EndEvent
  1586.  
  1587. Event <OnDisconnect_virclib> "*"
  1588.   PlayEventSound virc_disconnect
  1589. EndEvent
  1590.  
  1591. //--------------
  1592.  
  1593. Alias J
  1594.   if ([$1] == [])
  1595.     @l $list = $?="$Msg_J_ChanPrompt"
  1596.     Halt if [$list] == [INPUT_CANCELLED]
  1597.   else
  1598.     @l $list = $1-
  1599.   endif
  1600.  
  1601.   foreach ($x; $list)
  1602.     if !($ischannel($x))
  1603.       @l $x = #$x
  1604.     endif
  1605.     Join $x
  1606.   endforeach
  1607. EndAlias
  1608.  
  1609. Alias WI
  1610.   Whois $1-
  1611. EndAlias
  1612.  
  1613. Alias WW
  1614.   Whowas $1-
  1615. EndAlias
  1616.  
  1617. Alias SV
  1618.   Say [ViRC $ver ($build/$exebuild), virc.lib $LibVersion]
  1619. EndAlias
  1620.  
  1621. Alias DECODEPINGINTERVAL
  1622.   @ $fresult = $decodeminterval($($mtime() - $1))
  1623. EndAlias
  1624.  
  1625. Alias WALL
  1626.   if ($ischannel($1))
  1627.     @l $chan = $1
  1628.     @l $msg = $2-
  1629.   else
  1630.     @l $chan = $C
  1631.     @l $msg = $1-
  1632.   endif
  1633.   
  1634.   // prefer @#chan, then multinicks, then individual messages (ack)
  1635.   
  1636.   @l $omsg = [\bOps\b:\b$chan\b] $msg
  1637.   
  1638.   if ($getservsetting(atchan))
  1639.     ^Notice @$chan $omsg
  1640.   else if ($getservsetting(multinicks))
  1641.     foreach ($a,$b,$c,$d,$e,$f,$g,$h,$i; $listremove($N $oplist($chan)))
  1642.       ^Notice $a,$b,$c,$d,$e,$f,$g,$h,$i $omsg
  1643.     endforeach
  1644.   else
  1645.     foreach ($i; $listremove($N $oplist($chan)))
  1646.       ^Notice $i $omsg
  1647.     endforeach
  1648.   endif
  1649.  
  1650.   TextOut > $chan ecNotice  -> [\bOps\b:\b$chan\b]\t$msg
  1651. EndAlias
  1652.  
  1653. Alias WHO
  1654.   // override the built-in command to use windowed /who instead
  1655.   WindowedWho $1-
  1656. EndAlias
  1657.  
  1658. Alias ONALL
  1659.   @l $cnt = $listelementcount($serverlist())
  1660.   // 0 is the global interpreter
  1661.   for (@l $i = 1; $i < $cnt; $i++)
  1662.     OnServer $i $1-
  1663.   endfor
  1664. EndAlias
  1665.  
  1666. Alias AASAY
  1667.   OnAll ASay $1-
  1668. EndAlias
  1669.  
  1670. Alias AAME
  1671.   OnAll AMe $1-
  1672. EndAlias
  1673.  
  1674. Alias CHATOPS
  1675.   Raw CHATOPS :$1-
  1676. EndAlias
  1677.  
  1678. Alias GLOBOPS
  1679.   Raw GLOBOPS :$1-
  1680. EndAlias
  1681.  
  1682. Alias SQUERY
  1683.   TextOut ecPRIVMSG  -> $_nickspacing(**\b$1\b** $2-)
  1684.   Raw SQUERY $1 :$2-
  1685. EndAlias
  1686.  
  1687. //--------------
  1688.  
  1689. Alias ISIGNORING
  1690.   @ $fresult = $($getuserfield($1 ignore) != 0)
  1691. EndAlias
  1692.  
  1693. Alias ISIGNORINGNICK
  1694.   @ $fresult = $isignoring($1!$getaddress($1))
  1695. EndAlias
  1696.  
  1697. Alias _IGNMASK
  1698.   switch $1
  1699.     case matches *!*@*
  1700.       @ $fresult = $@
  1701.     case matches *@*
  1702.       @ $fresult = $uhosttomask($@)
  1703.     case else
  1704.       @ $fresult = $nicktomask($@)
  1705.   endswitch
  1706. EndAlias
  1707.  
  1708. Alias IGNORE
  1709.   @l $mask = $_ignmask($1)
  1710.   SetUserField $mask ignore 1
  1711.   @l $maskstr = $mask
  1712.   TextOut ecScript *** $eval($Msg_Ignore_Start)
  1713. EndAlias
  1714.  
  1715. Alias UNIGNORE
  1716.   @l $mask = $_ignmask($1)
  1717.   @l $maskstr = $mask
  1718.   if !($isignoring($mask))
  1719.     TextOut ecError *** $eval($Msg_Ignore_NotIgnoring)
  1720.   else
  1721.     DelUserField $mask ignore
  1722.     TextOut ecScript *** $eval($Msg_Ignore_End)
  1723.   endif
  1724. EndAlias
  1725.  
  1726. Alias IGNORES
  1727.   TextOut ecScript $Msg_Ignore_ListStart
  1728.   foreach ($a,$b,$c; $userfieldlist(ignore))
  1729.     TextOut ecScript $a $b $c
  1730.   endforeach
  1731.   TextOut ecScript $Msg_List_End
  1732. EndAlias
  1733.  
  1734. //--------------
  1735.  
  1736. // Handle irc:// URLs
  1737. // Windows sends /irchyperlink <url> through DDE when a link to an IRC server
  1738. // is activated. The format is irc://<server>[:port][/[channel]]
  1739.  
  1740. Alias IRCHYPERLINK
  1741.   @l $url = $1-
  1742.   // strip irc://
  1743.   @l $url = $strtokr(// $url)
  1744.   // strip trailing /
  1745.   while [$substr($url $length($url) 1)] == [/]
  1746.     @l $url = $substr($url 1 $($length($url) - 1))
  1747.   endwhile
  1748.   // contains a channel?
  1749.   @l $chan = $rstrtokr(/ $url)
  1750.   @l $host = $rstrtokl(/ $url)
  1751.   @l $hostmask = $host
  1752.   
  1753.   if $strpos(: $host) == 0
  1754.     @l $hostmask = $host:*
  1755.     @l $host = $host:6667
  1756.   endif
  1757.   
  1758.   if ([$chan] != []) && (!$ischannel($chan))
  1759.     @l $chan = #$chan
  1760.   endif
  1761.   
  1762.   // a link to a channel? already connected to the right server?
  1763.   if [$chan] != []
  1764.     @l $id = 1
  1765.     foreach ($i; $listdelete(0 $serverlist()))
  1766.       if $globmatch($i $hostmask) || $globmatch($onserver($id $$serverhost()) $hostmask)
  1767.         OnServer $id join $chan
  1768.         Halt
  1769.       endif
  1770.       $id++
  1771.     endforeach
  1772.   endif
  1773.   // no, open a server window and connect it
  1774.   OnServer $newserverwindow($host) _IRCHYPERLINK2 $chan
  1775. EndAlias
  1776.  
  1777. Alias _IRCHYPERLINK2
  1778.   if [$1] != []
  1779.     @l $chan = $1
  1780.     @ $ConnectHooks[irchyperlink] = join $1
  1781.   endif
  1782.   Connect
  1783. EndAlias
  1784.  
  1785. //--------------
  1786.  
  1787. // Automatic event chaining!
  1788. // Add a handler, replacing any existing one with the same ID:
  1789. //   @e+ <obj.prop> = <handler_id>, <handler_code>
  1790. // Remove a handler:
  1791. //   @e- <obj.prop> = <handler_id>
  1792. // List event handlers:
  1793. //   foreach ($id,$code; $eventhandlers(<obj.prop>)
  1794. //     MessageBox id=$id, code=$code
  1795. //   endforeach
  1796. //   // or use it as an array...
  1797. //   @l $handler_array = $eventhandlers(<obj.prop>)
  1798. //   MessageBox default handler is $handler_array[default]
  1799.  
  1800. Alias @E+
  1801.   // @e+ $obj.Prop = id, handler
  1802.   // aliases beginning with @ don't have their parameters evaluated
  1803.   @l $objprop = $strtrim($upeval($strtokl(= $1-)))
  1804.   @l $rest = $strtokr(= $1-)
  1805.   @l $id = $strtrim($upeval($strtokl(, $rest)))
  1806.   @l $handler = $strtokr(, $rest)
  1807.   
  1808.   if $strpos($$ $handler) || $strpos(\ $handler)
  1809.     // needs to be evaluated before firing
  1810.     @l $handler = Eval $handler
  1811.   endif
  1812.   
  1813.   // get current handler
  1814.   @l $curhandler = $prop($objprop)
  1815.   // already a multi-handler?
  1816.   Parse $curhandler
  1817.     switch $0
  1818.       case MULTI_HANDLER:
  1819.         // add to handler array
  1820.         @l $harray = $1-
  1821.         @l $harray[$id] = $handler
  1822.       case multi NIL,NOP
  1823.         // just set handler
  1824.         @l $harray = $listquote($id) $listquote($handler)
  1825.       case else
  1826.         // set default + handler
  1827.         @l $harray = default $listquote($curhandler) $listquote($id) $listquote($handler)
  1828.     endswitch
  1829.   EndParse
  1830.   // set new multi-handler
  1831.   @p $objprop = MULTI_HANDLER $harray
  1832. EndAlias
  1833.  
  1834. Alias @E-
  1835.   // @e- $obj.Prop = id
  1836.   @l $objprop = $strtrim($upeval($strtokl(= $1-)))
  1837.   @l $id = $strtrim($upeval($strtokr(= $1-)))
  1838.   
  1839.   // get current handler
  1840.   @l $curhandler = $prop($objprop)
  1841.   // is it a multi-handler?
  1842.   Parse $curhandler
  1843.     if [$0] == [MULTI_HANDLER]
  1844.       // get handler array
  1845.       @l $harray = $1-
  1846.       // delete handler
  1847.       -@l $harray[$id]
  1848.       // set new handler
  1849.       @p $objprop = MULTI_HANDLER $harray
  1850.     endif
  1851.   EndParse
  1852. EndAlias
  1853.  
  1854. Alias EVENTHANDLERS
  1855.   @l $curhandler = $prop($1-)
  1856.   // is it a multi-handler?
  1857.   Parse $curhandler
  1858.     switch $0
  1859.       case MULTI_HANDLER:
  1860.         // dump handler array
  1861.         @ $fresult = $1-
  1862.       case multi NIL,NOP
  1863.         // no handler
  1864.         @ $fresult = $null
  1865.       case else
  1866.         // single handler
  1867.         @ $fresult = default $listquote($curhandler)
  1868.     endswitch
  1869.   EndParse
  1870. EndAlias
  1871.  
  1872. Alias MULTI_HANDLER
  1873.   // multi_handler "id1" "code1" "id2" "code2"...
  1874.   // have to be careful with local variables since all the handlers
  1875.   // will have access to them...
  1876.   foreach ($__id__,$__handler__; $1-)
  1877.     Chain $__handler__
  1878.   endforeach
  1879. EndAlias
  1880.  
  1881. //--------------
  1882.  
  1883. Alias _ACTIVE
  1884.   if ($getsetting(active$1))
  1885.     @ $fresult = \S$1:$2-\S
  1886.   else
  1887.     @ $fresult = $2-
  1888.   endif
  1889. EndAlias
  1890.  
  1891. // Active nicks
  1892.  
  1893. Alias CLICK_nick
  1894.   if ([$Button] == [mbRight])
  1895.     @ $ANServer = $currentserver()
  1896.     @ $ANChan = $C
  1897.     @ $ANPerson = $Text
  1898.     $ANPopup.Popup $ScreenX $ScreenY
  1899.   endif
  1900. EndAlias
  1901.  
  1902. // Active hosts
  1903.  
  1904. Alias CLICK_host
  1905.   if ([$1] == [double])
  1906.     DNS *$Text
  1907.   endif
  1908. EndAlias
  1909.  
  1910. // Active modes
  1911.  
  1912. Alias CLICK_mode
  1913.   if ([$Button] == [mbRight])
  1914.     @ $AMServer = $currentserver()
  1915.     @ $AMChan = $C
  1916.     @ $AMMode = $Text
  1917.     @p $AMReverseItem.Enabled = $isop($N $C)
  1918.     $AMPopup.Popup $ScreenX $ScreenY
  1919.   endif
  1920. EndAlias
  1921.  
  1922. Alias _AM_REVERSE_CLICK
  1923.   @l $out = $null
  1924.   Parse $AMMode
  1925.     for (@l $i = 1; $i <= $length($0); $i++)
  1926.       switch $substr($0 $i 1)
  1927.         case +:
  1928.           @l $out = ${out}-
  1929.         case -:
  1930.           @l $out = ${out}+
  1931.         case else
  1932.           @l $out = $out$@
  1933.       endswitch
  1934.     endfor
  1935.     Mode $AMChan $out $1-
  1936.   EndParse
  1937. EndAlias
  1938.  
  1939. // Active invites
  1940.  
  1941. Alias CLICK_invite
  1942.   if ([$1] == [double])
  1943.     Join $Text
  1944.   endif
  1945. EndAlias
  1946.  
  1947. Alias INITACTIVEPOPUPS
  1948.   if ([$ANPopup] != [$$ANPopup])
  1949.     Destroy $ANPopup
  1950.   endif
  1951.   
  1952.   @ $ANPopup = $new(TPopupMenu)
  1953.   $ANPopup.LoadFromMenuTree MT_CHANNELNICKSPOPUP
  1954.   
  1955.   @l $ts = $new(TStringList)
  1956.   $ts.GetMenuItemList MT_CHANNELNICKSPOPUP
  1957.   for (@l $i = 0; $i < $prop($ts.Count); $i++)
  1958.     @l $x = $ts.GetString($i)
  1959.     continue if !$isobject($_item.$x)
  1960.     @p $_item.$x.Hint = $getmenuhint($x on MT_CHANNELNICKSPOPUP)
  1961.     @p $_item.$x.OnClick = Eval OnServer $$ANServer FireMenuItem > $$ANChan $x on MT_CHANNELNICKSPOPUP = $$ANPerson
  1962.   endfor
  1963.   Destroy $ts
  1964.   
  1965.   if ([$AMPopup] != [$$AMPopup])
  1966.     Destroy $AMPopup
  1967.   endif
  1968.   
  1969.   @ $AMPopup = $new(TPopupMenu)
  1970.   @ $AMReverseItem = $new(TMenuItem ownedby $AMPopup)
  1971.   @p $AMReverseItem.Caption = $Msg_Active_ReverseCaption
  1972.   @p $AMReverseItem.Hint = $Msg_Active_ReverseHint
  1973.   @p $AMReverseItem.OnClick = Eval OnServer $$AMServer _AM_REVERSE_CLICK
  1974.   $AMPopup.Items.Add $AMReverseItem
  1975. EndAlias
  1976.  
  1977. //--------------
  1978.  
  1979. // Hyperlink right-click popup
  1980.  
  1981. With > localized_menutree MT_HYPERPOPUP
  1982.   M_GOTOURL <none> 0 0 @@Msg_Active_GotoLinkCaption
  1983.   M_NEWWIN  <none> 0 0 @@Msg_Active_LinkNewCaption
  1984.   M_SEP1    <none> 0 0 -
  1985.   M_COPYURL <none> 0 0 @@Msg_Active_CopyLinkCaption
  1986. EndWith
  1987.  
  1988. Alias INITHYPERPOPUP
  1989.   if [$HyperPopup] != [$$HyperPopup]
  1990.     Destroy $HyperPopup
  1991.   endif
  1992.   
  1993.   @ $HyperPopup = $new(TPopupMenu)
  1994.   $HyperPopup.LoadFromMenuTree MT_HYPERPOPUP
  1995.   
  1996.   @p $_item.M_GOTOURL.Default = True
  1997.   @p $_item.M_GOTOURL.Hint = $Msg_Active_GotoLinkHint
  1998.   @e $_item.M_GOTOURL.OnClick = WebHyperlink $HPLink
  1999.   
  2000.   @p $_item.M_COPYURL.Hint = $Msg_Active_CopyLinkHint
  2001.   @e $_item.M_COPYURL.OnClick = SetClipboard $HPLink
  2002.  
  2003.   @p $_item.M_NEWWIN.Hint = $Msg_Active_LinkNewHint
  2004.   @e $_item.M_NEWWIN.OnClick = Exec iexplore $HPLink
  2005. EndAlias
  2006.  
  2007. Alias _HYPER_POPUP
  2008.   @ $HPLink = $Text
  2009.   $HyperPopup.Popup $ScreenX $ScreenY
  2010. EndAlias
  2011.  
  2012. Event <OnCreateWindow_hyperpopup> "*"
  2013.   @l $output = $mapobject($1:Output)
  2014.   @e+ $output.OnHyperlinkPopup = virclib, _hyper_popup
  2015.   UnmapObject $output
  2016. EndEvent
  2017.  
  2018. //--------------
  2019.  
  2020. // Status window
  2021.  
  2022. Event <OnUserSetupOK_statuswindow> "*"
  2023.   if $isobject($statusWindow)
  2024.     @p $statusWindow.Background = ecBackground
  2025.     @l $font = $parsefont($getsetting(Fonts Main))
  2026.     @p $statusWindow.Font.Name = $font[name]
  2027.     @p $statusWindow.Font.Size = $font[size]
  2028.   endif
  2029. EndEvent
  2030.  
  2031. Alias PARSEFONT
  2032.   // $parsefont(Font Name <size> ["[style]"])
  2033.   
  2034.   @l $str = $1-
  2035.   @l $temp = $null
  2036.   
  2037.   @l $temp[style] = $rstrtokrex(" " $str)
  2038.   @l $str = $rstrtoklex(" " $str)
  2039.   
  2040.   if $isnumeric($temp[style])
  2041.     @l $temp[size] = $temp[style]
  2042.     @l $temp[style] = $null
  2043.     @l $temp[name] = $str
  2044.   else
  2045.     @l $temp[size] = $rstrtokrex(" " $str)
  2046.     @l $temp[name] = $rstrtoklex(" " $str)
  2047.   endif
  2048.   
  2049.   @ $fresult = $temp
  2050. EndAlias
  2051.  
  2052. Alias INPUTDEFAULT
  2053.   @l $prompt = $strtokl(| $1-)
  2054.   @l $default = $strtokr(| $1-)
  2055.   @l $result = $?="$prompt|$default"
  2056.   if [$result] == [INPUT_CANCELLED]
  2057.     @l $result = $default
  2058.   endif
  2059.   @ $fresult = $result
  2060. EndAlias
  2061.  
  2062. Alias SHOWSTATUSWINDOW
  2063.   if ($currentserver() != 0)
  2064.     OnServer 0 ShowStatusWindow
  2065.     Halt
  2066.   endif
  2067.  
  2068.   // show the tab bar first
  2069.   @l $tabbar = $mapobject(!Main:TabBar)
  2070.   @p $tabbar.Visible = True
  2071.   UnmapObject $tabbar
  2072.   
  2073.   if ($isobject($statusWindow))
  2074.     @l $wasvisible = $prop($statusWindow.Visible)
  2075.     Destroy $statusWindow
  2076.     Destroy $statusPopup
  2077.   else
  2078.     @l $wasvisible = True
  2079.   endif
  2080.   
  2081.   @ $statusWindow = $new(TMonkeyScroller ownedby 0 position 0,$($prop(0.ClientHeight) - 140),$($prop(0.ClientWidth) - 30),63)
  2082.   @p $statusWindow.Align = alBottom
  2083.   @p $statusWindow.ScrollBars = ssVertical
  2084.   @p $statusWindow.Background = ecBackground
  2085.   @l $font = $parsefont($getsetting(Fonts Main))
  2086.   @p $statusWindow.Font.Name = $font[name]
  2087.   @p $statusWindow.Font.Size = $font[size]
  2088.   @p $statusWindow.Visible = $wasvisible
  2089.   @p $statusWindow.OnCopyText = _status_copytext
  2090.   @e $statusWindow.OnScriptLink = _status_scriptlink
  2091.   @e $statusWindow.OnHyperlinkPopup = _hyper_popup
  2092.  
  2093.   @ $statusPopup = $new(TPopupMenu)
  2094.   @p $statusWindow.PopupMenu = $statusPopup
  2095.   
  2096.   @l $item = $new(TMenuItem ownedby $statusPopup)
  2097.   @p $item.Caption = $Msg_Status_ClearCaption
  2098.   @p $item.OnClick = Clear %$statusWindow
  2099.   $statusPopup.Items.Add $item
  2100.   
  2101.   @l $item = $new(TMenuItem ownedby $statusPopup)
  2102.   @p $item.Caption = $Msg_Status_BufSizeCaption
  2103.   // @E causes the function calls to be evaluated when the menu item is clicked
  2104.   @e $item.OnClick = @p $statusWindow.BufferSize = $inputdefault(Enter new buffer size:|$prop($statusWindow.BufferSize))
  2105.   $statusPopup.Items.Add $item
  2106.   
  2107.   @l $item = $new(TMenuItem ownedby $statusPopup)
  2108.   @p $item.Caption = $Msg_Status_HideCaption
  2109.   @p $item.OnClick = DisableStatus
  2110.   $statusPopup.Items.Add $item
  2111.  
  2112.   // let other scripts change the status window
  2113.   FireEvent <OnCreateStatusWindow* $statusWindow $statusPopup
  2114.   
  2115.   // change enabledness of 'show/hide status window' menu items
  2116.   UpdateMainMenu
  2117. EndAlias
  2118.  
  2119. Alias TOS
  2120.   if !($isobject($statusWindow))
  2121.     ShowStatusWindow
  2122.   endif
  2123.   
  2124.   if ([$2] == [***])
  2125.     @l $msg = [$time(hh:nn)] $3-
  2126.   else
  2127.     @l $msg = [$time(hh:nn)] $2-
  2128.   endif
  2129.   *TextOut > %$statusWindow $1 $msg
  2130.   @ $LastStatus = $msg
  2131. EndAlias
  2132.  
  2133. Alias TEXTOUT
  2134.   // redirect textouts to the status window
  2135.   
  2136.   if ([$1] != [>]) && ([$2] == [***])
  2137.     // automatically show status window if necessary
  2138.     if ($isobject($statusWindow))
  2139.       if ([$prop($statusWindow.Visible)] == [False]) && ($getsetting(autoshowstatus))
  2140.         EnableStatus
  2141.       endif
  2142.     else if ($getsetting(autoshowstatus))
  2143.       ShowStatusWindow
  2144.     endif
  2145.     
  2146.     if ($isobject($statusWindow)) && ([$prop($statusWindow.Visible)] == [True])
  2147.       TOS $1-
  2148.     else
  2149.       *TextOut $1-
  2150.     endif
  2151.   else
  2152.     *TextOut $1-
  2153.   endif
  2154. EndAlias
  2155.  
  2156. Alias _STATUS_MOUSEUP
  2157.   @l $txt = $prop($Sender.SelText)
  2158.   if ([$txt] != [])
  2159.      @l $nt = $listjoin($char(13)$char(10) $listsplit($char(10) $txt))
  2160.      SetClipboard $nt
  2161.      @p $Sender.SelLength = 0
  2162.   endif
  2163. EndAlias
  2164.  
  2165. Alias _STATUS_COPYTEXT
  2166.   if ([$Text] != [])
  2167.      @l $nt = $listjoin($char(13)$char(10) $listsplit($char(10) $Text))
  2168.      SetClipboard $nt
  2169.   endif
  2170. EndAlias
  2171.  
  2172. Alias _STATUS_SCRIPTLINK
  2173.   if $isinset([ssDouble] $Shift)
  2174.     @l $x = double
  2175.   else
  2176.     @l $x = single
  2177.   endif
  2178.   @ $_Status_SL_Cmd = CLICK_$Command $x $Text
  2179.  
  2180.   @l $TS = $new(TStringList)
  2181.   $TS.Add @l $$Button = $Button
  2182.   $TS.Add @l $$Text = $Text
  2183.   $TS.Add @l $$C = .
  2184.   $TS.Add @l $$X = $X
  2185.   $TS.Add @l $$Y = $Y
  2186.   $TS.Add @l $$ScreenX = $ScreenX
  2187.   $TS.Add @l $$ScreenY = $ScreenY
  2188.   $TS.Add Chain $$_Status_SL_Cmd
  2189.   OnServer $activeserver() $TS.Execute
  2190.   Destroy $TS
  2191. EndAlias
  2192.  
  2193. Alias RLS
  2194.   if ([$LastStatus] != [$$LastStatus])
  2195.     Say $LastStatus
  2196.   endif
  2197. EndAlias
  2198.  
  2199. Alias ENABLESTATUS
  2200.   if ($isobject($statusWindow))
  2201.     @p $statusWindow.Visible = True
  2202.     UpdateMainMenu
  2203.   else
  2204.     ShowStatusWindow
  2205.   endif
  2206. EndAlias
  2207.  
  2208. Alias DISABLESTATUS
  2209.   if ($isobject($statusWindow))
  2210.     @p $statusWindow.Visible = False
  2211.     UpdateMainMenu
  2212.   endif
  2213. EndAlias
  2214.  
  2215. Alias ISSTATUSVISIBLE
  2216.   if ($isobject($statusWindow))
  2217.     @ $fresult = $([$prop($statusWindow.Visible)] == [True])
  2218.   else
  2219.     @ $fresult = 0
  2220.   endif
  2221. EndAlias
  2222.  
  2223. //--------------
  2224.  
  2225. Alias INITCLOCKLABEL
  2226.   // do neat stuff
  2227.   Class TClockLabel
  2228.     Private Property Timer
  2229.     Private Property Label
  2230.     Private Property Owner
  2231.     Property Top write SetRelay
  2232.     Property Left write SetRelay
  2233.     Property Width write SetRelay
  2234.     Property Height write SetRelay
  2235.     Property Visible write SetRelay
  2236.     Property OnClick write SetRelay
  2237.     Property Enabled write SetEnabled read GetEnabled
  2238.     Private Method <Create>
  2239.       @l $pos = $null
  2240.       @l $labclass = TLabel
  2241.       foreach ($i,$j; $1-)
  2242.         switch $i
  2243.           case ownedby:
  2244.             @p $Self.Owner = $j
  2245.           case position:
  2246.             @l $pos = $j
  2247.           case labelclass:
  2248.             @l $labclass = $j
  2249.         endswitch
  2250.       endforeach
  2251.       if ([$pos] != [])
  2252.         @p $Self.Label = $new($labclass ownedby $prop($Self.Owner) position $pos)
  2253.       else
  2254.         @p $Self.Label = $new($labclass ownedby $prop($Self.Owner))
  2255.       endif
  2256.       @l $timer = $new(TTimer)
  2257.       @p $Self.Timer = $timer
  2258.       @p $timer.Interval = 250
  2259.       @p $timer.OnTimer = $Self.Timer_Tick
  2260.       @p $timer.Enabled = True
  2261.       foreach ($i; Top Left Width Height Visible OnClick)
  2262.         @p $Self.$i = $prop($prop($Self.Label).$i)
  2263.       endforeach
  2264.     EndMethod
  2265.     Private Method <Destroy>
  2266.       Destroy $prop($Self.Label)
  2267.       Destroy $prop($Self.Timer)
  2268.     EndMethod
  2269.     Private Method Timer_Tick
  2270.       @p $prop($Self.Label).Caption = $time()
  2271.     EndMethod
  2272.     Private Method SetRelay
  2273.       @p $prop($Self.Label).$1 = $2-
  2274.       @p $Self.$1 = $prop($prop($Self.Label).$1)
  2275.     EndMethod
  2276.     Private Method SetEnabled
  2277.       @p $prop($Self.Timer).Enabled = $2-
  2278.     EndMethod
  2279.     Private Method GetEnabled
  2280.       @ $fresult = $prop($prop($Self.Timer).Enabled)
  2281.     EndMethod
  2282.   EndClass
  2283. EndAlias
  2284.  
  2285. //--------------
  2286.  
  2287. Event <OnCacheBitmaps_virclib> "*"
  2288.   // replace built-in _join.bmp, etc. with those found in the image path
  2289.   @l $bmps = _join.bmp _part.bmp _joinign.bmp _partign.bmp _quit.bmp _nick.bmp _mode.bmp _topic.bmp _dcc.bmp
  2290.   foreach ($i; $listfromwords($bmps))
  2291.     if $fileexists($getpath(image)$i)
  2292.       CacheBitmap $i $bitmap($getpath(image)$i)
  2293.     endif
  2294.   endforeach
  2295. EndEvent
  2296.  
  2297. Event <OnStart_cachebitmaps> "*"
  2298.   // hook into the config form to grab the old image path
  2299.   @l $setup = $mapobject(!UserSetup)
  2300.   @e+ $setup.OnShow = cachebitmaps, @ $OldImagePath = $getpath(image)
  2301.   UnmapObject $setup
  2302. EndEvent
  2303.  
  2304. Event <OnUserSetupOK_cachebitmaps> "*"
  2305.   if [$getpath(image)] != [$OldImagePath]
  2306.     FlushBitmapCache
  2307.   endif
  2308. EndEvent
  2309.  
  2310. //--------------
  2311.  
  2312. Alias _ALLSCRIPTS
  2313.   @ $fresult = $listcat($listquote($getsetting(ScriptFile)) $listquote($getsetting(Scripts LocalScript)) $getsetting(Scripts AddOn))
  2314. EndAlias
  2315.  
  2316. Event <OnStart_autorehash> "*"
  2317.   // hook into the config form to grab the old script list
  2318.   @l $setup = $mapobject(!UserSetup)
  2319.   @e+ $setup.OnShow = autorehash1, @ $OldScriptList = $_allscripts()
  2320.   @e+ $setup.OnShow = autorehash2, @ $OldScriptPath = $getpath(script)
  2321.   UnmapObject $setup
  2322. EndEvent
  2323.  
  2324. Event <OnUserSetupOK_autorehash> "*"
  2325.   if ([$_allscripts()] != [$OldScriptList]) || ([$getpath(script)] != [$OldScriptPath])
  2326.     Rehash
  2327.   endif
  2328. EndEvent
  2329.  
  2330. //--------------
  2331.  
  2332. Event <OnStart_virclib> "*"
  2333. #  InitClockLabel
  2334. #  @l $about = $mapobject(!About)
  2335. #  @ $clocklabel = $new(TClockLabel ownedby $about position 184,152,64,16)
  2336. #  UnmapObject $about
  2337. #  @p $clocklabel.OnClick = Beep
  2338.   
  2339.   if ($build != $LibBuild)
  2340.     @l $obj = $mapobject(!About:VersionLabel)
  2341.     @p $obj.Caption = $prop($obj.Caption) / virc.lib $LibVersion
  2342.     UnmapObject $obj
  2343.   endif
  2344.   
  2345.   AddScriptControl config edit "$Msg_SS_defumode" defumode = +i
  2346.   AddScriptControl config edit "$Msg_SS_autojoin" autojoin
  2347.   AddScriptControl config edit "$Msg_SS_userinfo" userinfo
  2348.  
  2349.   AddScriptControl network edit "$Msg_SS_defumode" defumode
  2350.   AddScriptControl network edit "$Msg_SS_autojoin" autojoin
  2351.   AddScriptControl network edit "$Msg_SS_userinfo" userinfo
  2352.   AddScriptControl network codeedit "$Msg_SS_autoperform" autoperform
  2353.  
  2354.   AddScriptControl server edit "$Msg_SS_defumode" defumode
  2355.   AddScriptControl server edit "$Msg_SS_autojoin" autojoin
  2356.   AddScriptControl server edit "$Msg_SS_userinfo" userinfo
  2357.   AddScriptControl server codeedit "$Msg_SS_autoperform" autoperform
  2358.   
  2359.   AddScriptControl config edit "$Msg_SS_autoconnect" autoconnect
  2360.   AddScriptControl config check "$Msg_SS_hideonautojoin" hideonautojoin = 1
  2361.  
  2362.   AddScriptControl config check "$Msg_SS_usequery" usequery = 1
  2363.   AddScriptControl config check "$Msg_SS_showraw" showraw = 0
  2364.   AddScriptControl config check "$Msg_SS_autoshowstatus" autoshowstatus = 0
  2365.   AddScriptControl config radio "$Msg_SS_nickspacing" nickspacing "$Msg_SS_nickspacing_space" "$Msg_SS_nickspacing_tab" "$Msg_SS_nickspacing_table" = 2
  2366.   
  2367.   AddScriptControl config check "$Msg_SS_activenick" activenick = 1
  2368.   AddScriptControl config check "$Msg_SS_activehost" activehost = 1
  2369.   AddScriptControl config check "$Msg_SS_activemode" activemode = 1
  2370.   AddScriptControl config check "$Msg_SS_activeinvite" activeinvite = 1
  2371.   
  2372.   AddScriptControl config check "$Msg_SS_dccautoacceptchat" dccautoacceptchat = 0
  2373.   AddScriptControl config check "$Msg_SS_dccautoacceptsend" dccautoacceptsend = 0
  2374.   AddScriptControl config check "     $Msg_SS_dccautoresume" dccautoresume = 0
  2375.   AddScriptControl config edit "$Msg_SS_dccwarnexts" dccwarnexts = exe,lib,vsc,vbs,js,bat,com,pif,doc,xls,shs,scr
  2376.   
  2377.   AddScriptControl config check "$Msg_SS_flashtray" flashtray = 1
  2378.   AddScriptControl config check "$Msg_SS_flashtaskbar" flashtaskbar = 0
  2379.   
  2380.   AddEventSound virc_start "$Msg_ES_virc" "$Msg_ES_virc_start" default vircstart.wav
  2381.   AddEventSound virc_exit "$Msg_ES_virc" "$Msg_ES_virc_exit" default vircexit.wav
  2382.   AddEventSound notify_join "$Msg_ES_virc" "$Msg_ES_notify_join" default nfyjoin.wav
  2383.   AddEventSound notify_quit "$Msg_ES_virc" "$Msg_ES_notify_quit" default nfyquit.wav
  2384.   AddEventSound virc_connect "$Msg_ES_virc" "$Msg_ES_virc_connect" default connect.wav
  2385.   AddEventSound virc_disconnect "$Msg_ES_virc" "$Msg_ES_virc_disconnect" default disconnect.wav
  2386.  
  2387.   AddEventSound virc_dcc "$Msg_ES_dcc" "$Msg_ES_virc_dcc" default dcc.wav
  2388.   AddEventSound dcc_chattext "$Msg_ES_dcc" "$Msg_ES_dcc_chattext" default msg.wav
  2389.  
  2390.   AddEventSound irc_join "$Msg_ES_irc" "$Msg_ES_irc_join" default join.wav
  2391.   AddEventSound irc_part "$Msg_ES_irc" "$Msg_ES_irc_part" default part.wav
  2392.   AddEventSound irc_quit "$Msg_ES_irc" "$Msg_ES_irc_quit" default part.wav
  2393.   AddEventSound irc_msg "$Msg_ES_irc" "$Msg_ES_irc_msg" default msg.wav
  2394.   AddEventSound irc_notice "$Msg_ES_irc" "$Msg_ES_irc_notice" default notice.wav
  2395.   AddEventSound irc_chantext "$Msg_ES_irc" "$Msg_ES_irc_chantext" default chantext.wav
  2396.   AddEventSound irc_chanmsg "$Msg_ES_irc" "$Msg_ES_irc_chanmsg" default msg.wav
  2397.   AddEventSound irc_querytext "$Msg_ES_irc" "$Msg_ES_irc_querytext" default msg.wav
  2398.   AddEventSound irc_chanact "$Msg_ES_irc" "$Msg_ES_irc_chanact" default chantext.wav
  2399.   AddEventSound irc_invite "$Msg_ES_irc" "$Msg_ES_irc_invite" default invite.wav
  2400.   AddEventSound irc_mode "$Msg_ES_irc" "$Msg_ES_irc_mode" default mode.wav
  2401.   AddEventSound irc_kick "$Msg_ES_irc" "$Msg_ES_irc_kick" default kick.wav
  2402.   AddEventSound irc_nick "$Msg_ES_irc" "$Msg_ES_irc_nick" default nickchange.wav
  2403.   AddEventSound irc_servernotice "$Msg_ES_irc" "$Msg_ES_irc_servernotice" default servnotice.wav
  2404.   AddEventSound irc_ctcp "$Msg_ES_irc" "$Msg_ES_irc_ctcp" default ctcp.wav
  2405.   AddEventSound irc_rctcp "$Msg_ES_irc" "$Msg_ES_irc_rctcp" default ctcp.wav
  2406.   AddEventSound irc_ping "$Msg_ES_irc" "$Msg_ES_irc_ping" default ping.wav
  2407.   AddEventSound irc_rping "$Msg_ES_irc" "$Msg_ES_irc_rping" default ping.wav
  2408.   AddEventSound irc_topic "$Msg_ES_irc" "$Msg_ES_irc_topic" default topic.wav
  2409.   
  2410.   PlayEventSound virc_start
  2411.   
  2412.   @ $TrayMsgCount = 0
  2413.   @ $MinimizedToTray = 0
  2414.   @ $InitializedTables = 0
  2415.  
  2416.   // set up application events
  2417.   @l $appevents = $mapobject(!Main:AppEvents)
  2418.   @e+ $appevents.OnActivate = stopflashing, _stopflashing
  2419.  
  2420.   // restore NLX settings
  2421.   if [$nlx_config] != [$$nlx_config]
  2422.     NLConfig $nlx_config
  2423.   endif
  2424.  
  2425.   // first run? load recommended scripts
  2426.   if $FirstRun
  2427.     @l $addons = $getsetting(Scripts AddOn)
  2428.     @l $newaddons = $listunique($listcat($addons $RecommendedAddOns))
  2429.     SetSetting Scripts AddOn = $newaddons
  2430.   endif
  2431.  
  2432.   // don't auto-connect if a .chat file or script is being loaded or we're importing servers
  2433.   @l $do_autoconnect = 1
  2434.   @l $params = $paramlist()
  2435.   foreach ($i; -chat -importservers -loadscript -irchyperlink)
  2436.     if $listindexof($i $params) != -1
  2437.       @l $do_autoconnect = 0
  2438.       break
  2439.     endif
  2440.   endforeach
  2441.   
  2442.   if ($do_autoconnect)
  2443.     if !($isinset([ctrl] $shiftkeys_active()))
  2444.       @l $acon = $getsetting(autoconnect)
  2445.       if ([$acon] != [])
  2446.         foreach ($i; $acon)
  2447.           OnServer $NewServerWindow() Server $i
  2448.           break if $isinset([ctrl] $shiftkeys_active())
  2449.         endforeach
  2450.       endif
  2451.     endif
  2452.   endif
  2453.  
  2454.   // set up popups
  2455.   InitActivePopups
  2456.   InitHyperPopup
  2457. EndEvent
  2458.  
  2459. Event <OnClose_virclib> "*"
  2460.   // save NLX settings
  2461.   @s $nlx_config = $nlconfig()
  2462.  
  2463.   PlayEventSound virc_exit
  2464. EndEvent
  2465.  
  2466. Alias _STOPFLASHING
  2467.   @l $trayicon = $mapobject(!Main:TrayIcon)
  2468.   @p $trayicon.Flashing = False
  2469.   UnmapObject $trayicon
  2470. EndAlias
  2471.  
  2472. Event <OnMinimizeToTray_virclib> "*"
  2473.   @ $TrayMsgCount = 0
  2474.   @ $MinimizedToTray = 1
  2475.   @l $trayicon = $mapobject(!Main:TrayIcon)
  2476.   @p $trayicon.Hint = Visual IRC ($Msg_Tray_NoMsgs)
  2477.   UnmapObject $trayicon
  2478. EndEvent
  2479.  
  2480. Event <OnRestoreFromTray_virclib> "*"
  2481.   @ $MinimizedToTray = 0
  2482.   @l $trayicon = $mapobject(!Main:TrayIcon)
  2483.   @p $trayicon.Hint = Visual IRC
  2484.   UnmapObject $trayicon
  2485. EndEvent
  2486.  
  2487. Alias _INCTRAYMSGCOUNT
  2488.   if ($MinimizedToTray)
  2489.     $TrayMsgCount++
  2490.     @l $trayicon = $mapobject(!Main:TrayIcon)
  2491.     if ($TrayMsgCount == 1)
  2492.       @p $trayicon.Hint = ViRC (1 $Msg_Tray_OneMsg)
  2493.     else
  2494.       @p $trayicon.Hint = ViRC ($TrayMsgCount $Msg_Tray_ManyMsgs)
  2495.     endif
  2496.     // flash tray icon if allowed
  2497.     if $GetSetting(flashtray)
  2498.       @p $trayicon.Flashing = True
  2499.     endif
  2500.     UnmapObject $trayicon
  2501.   endif
  2502.   
  2503.   // flash taskbar icon if allowed and necessary
  2504.   if (!$IsAppActive()) && ($GetSetting(flashtaskbar))
  2505.     FlashTaskbar auto
  2506.   endif
  2507. EndAlias
  2508.  
  2509. @ $ConnectHooks = $null
  2510.  
  2511. // merge logging popup into other menus
  2512. MergeMenu MT_LOGGING after MT_SERVERPOPUP
  2513. MergeMenu MT_LOGGING after MT_CHANNELTEXTPOPUP
  2514. MergeMenu MT_LOGGING after MT_QUERYPOPUP
  2515. MergeMenu MT_LOGGING after MT_CHATPOPUP
  2516.  
  2517. ^Load toolbars.vsc
  2518.